type - java generics parameter
¿Cómo estático el método genérico de Java? (3)
El siguiente es un fragmento sobre cómo hacer una clase genérica java para agregar un solo elemento a una matriz. ¿Cómo puedo hacer de appendToArray un método estático? Agregar estática a la firma del método da como resultado errores de compilación.
public class ArrayUtils<E> {
public E[] appendToArray(E[] array, E item) {
E[] result = (E[])new Object[array.length+1];
result[array.length] = item;
return result;
}
}
Debe mover el parámetro de tipo al nivel de método para indicar que tiene un método genérico en lugar de genérico:
public class ArrayUtils {
public static <T> E[] appendToArray(E[] array, E item) {
E[] result = (E[])new Object[array.length+1];
result[array.length] = item;
return result;
}
}
lo único que puede hacer es cambiar su firma a
public static <E> E[] appendToArray(E[] array, E item)
Detalles importantes:
Las expresiones genéricas que preceden al valor de retorno siempre introducen (declaran) una nueva variable de tipo genérico.
Además, las variables de tipo entre tipos ( ArrayUtils
) y métodos estáticos ( appendToArray
) nunca interfieren entre sí.
Entonces, ¿qué significa esto? En mi respuesta <E>
ocultaría el E
de ArrayUtils<E>
si el método no fuera static
. Y <E>
no tiene nada que ver con la E
de ArrayUtils<E>
.
Para reflejar mejor este hecho, una respuesta más correcta sería:
public static <I> I[] appendToArray(I[] array, I item)
public static <E> E[] appendToArray(E[] array, E item) { ...
Tenga en cuenta la <E>
.
Los métodos genéricos estáticos necesitan su propia declaración genérica ( public static <E>
) separada de la declaración genérica de la clase ( public class ArrayUtils<E>
).
Si el compilador se queja de una ambigüedad de tipo al invocar un método genérico estático (de nuevo no es probable en su caso, pero, en general, por las _class_.<_generictypeparams_>_methodname_
), aquí se explica cómo invocar explícitamente un método genérico estático utilizando un tipo específico ( _class_.<_generictypeparams_>_methodname_
):
String[] newStrings = ArrayUtils.<String>appendToArray(strings, "another string");
Esto solo ocurriría si el compilador no puede determinar el tipo genérico porque, por ejemplo, el tipo genérico no está relacionado con los argumentos del método.