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.