El siguiente es un fragmento sobre cómo hacer que una clase genérica de Java agregue un solo elemento a una matriz. ¿Cómo puedo hacer 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;
}
}
Respuestas:
lo único que puede hacer es cambiar su firma a
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 los tipos (
ArrayUtils
) y los métodos estáticos (appendToArray
) nunca interfieren entre sí.Por lo tanto, ¿qué significa esto: En mi respuesta
<E>
sería ocultar laE
deArrayUtils<E>
si el método no seríastatic
. Y<E>
no tiene nada que ver con elE
deArrayUtils<E>
.Para reflejar mejor este hecho, una respuesta más correcta sería:
fuente
E
y la variable de tipo de método estáticoE
. Considero que es una práctica mucho mejor usar un nombre de variable diferente al declarar métodos genéricos, estáticos o de otro tipo, dentro de las clases genéricas.Tenga en cuenta el
<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 si acaso), a continuación se explica cómo invocar explícitamente un método genérico estático utilizando un tipo específico (
_class_.<_generictypeparams_>_methodname_
):Esto solo sucederí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.
fuente
Debe mover el parámetro de tipo al nivel de método para indicar que tiene un método genérico en lugar de una clase genérica:
fuente
Lo explicaré de una manera simple.
Los genéricos definidos a nivel de clase están completamente separados de los genéricos definidos a nivel de método (estático).
Cuando vea el código anterior en cualquier lugar, tenga en cuenta que la T definida en el nivel de clase no tiene nada que ver con la T definida en el método estático. El siguiente código también es completamente válido y equivalente al código anterior.
¿Por qué el método estático necesita tener sus propios genéricos separados de los de la Clase?
Entonces, cada vez que llama al método estático,
JVM lo interpreta de la siguiente manera.
Ambos dan las mismas salidas.
fuente