objeto - ¿Por qué no puedo pasar explícitamente el argumento tipo a un método Java genérico?
metodos genericos java (4)
@pauldoo Sí, tienes razón. Es una de las debilidades con el java generics imho.
Respuesta a Cheekysoft Me gustaría proponer también ver cómo los propios usuarios de Java lo hacen, como T [] AbstractCollection # toArray (T [] a). Creo que la versión de Cheekysofts es superior, pero la de Java tiene la ventaja de la familiaridad.
Editar: Enlace agregado. Re-editar: Encontré un error en SO :)
Seguimiento en Cheekysoft: Bueno, como se trata de una lista de algún tipo que debería devolverse, el ejemplo correspondiente debería tener el siguiente aspecto:
static <T> List<T> createEmptyList( List<T> a ) {
return new ArrayList<T>();
}
Pero sí, pasar el objeto de clase es claramente el mejor. Mi único argumento es el de la familiaridad, y en este caso exacto no vale mucho (de hecho es malo).
He definido una función de Java:
static <T> List<T> createEmptyList() {
return new ArrayList<T>();
}
Una forma de llamarlo es así:
List<Integer> myList = createEmptyList(); // Compiles
¿Por qué no puedo llamarlo pasando explícitamente el argumento de tipo genérico? :
Object myObject = createEmtpyList<Integer>(); // Doesn''t compile. Why?
Aparece el error Illegal start of expression
del compilador.
Cuando el compilador de Java no puede inferir el tipo de parámetro por sí mismo para un método estático, siempre puede pasarlo usando el nombre completo del método calificado: Clase. <Tipo> método ();
Object list = Collections.<String> emptyList();
Ha pasado bastante tiempo desde que exploré esas partes de Java, pero ...
Por qué no puedes hacerlo fue probablemente una opción de diseño de los desarrolladores del lenguaje. Sin embargo, debido a la eliminación de tipo empleada por Java, la información de genéricos se descarta en tiempo de compilación de todos modos, por lo que en su ejemplo crearía exactamente el mismo código de bytes si tenía o no el parámetro de tipo.
Puedes, si pasas el tipo como un parámetro de método.
static <T> List<T> createEmptyList( Class<T> type ) {
return new ArrayList<T>();
}
@Test
public void createStringList() {
List<String> stringList = createEmptyList( String.class );
}
Los métodos no pueden ser genéricos de la misma manera que un tipo, por lo que la única opción para un método con un tipo de devolución genérico de tipo dinámico - phew that''s a mouthful :-) - es pasar el tipo como un argumento.
Para obtener una excelente pregunta frecuente sobre los genéricos de Java, consulte las preguntas frecuentes sobre genéricos de Angelika Langer .
.
.
Seguir:
No tendría sentido en este contexto usar el argumento matriz como en Collection.toArray( T[] )
. La única razón por la que se utiliza una matriz es porque se utiliza la misma matriz (preasignada) para contener los resultados (si la matriz es lo suficientemente grande como para que quepan todos). Esto ahorra en la asignación de una nueva matriz en tiempo de ejecución todo el tiempo.
Sin embargo, a los fines de la educación, si desea utilizar la matriz de escritura, la sintaxis es muy similar:
static <T> List<T> createEmptyList( T[] array ) {
return new ArrayList<T>();
}
@Test
public void testThing() {
List<Integer> integerList = createEmptyList( new Integer[ 1 ] );
}