useful type parameter method generic example are java generics

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.