¿Cuáles son las diferencias entre List
, List<?>
, List<T>
, List<E>
, y List<Object>
?
1. Lista
List
: es un tipo sin formato, por lo tanto no typesafe
. Solo generará un error de tiempo de ejecución cuando el casting sea malo. Queremos un error de tiempo de compilación cuando el reparto es malo. No se recomienda su uso.
2. Lista <?>
List<?>
es un comodín ilimitado. ¿Pero no estoy seguro de para qué sirve? Puedo imprimir un List<?>
sin problema:
public static void test(List<?> list){
System.out.println(list); // Works
}
¿Por qué no puedo agregar elementos a un List<?>
?
public static void test(List<?> list){
list.add(new Long(2)); // Error
list.add("2"); // Error
System.out.println(list);
}
3. Lista <T>
public static void test(List<T> list){ // T cannot be resolved
System.out.println(list);
}
No entiendo esta sintaxis. Vi algo como esto, y funciona:
public <T> T[] toArray(T[] a){
return a;
}
A veces, veo <T>
, o <E>
, o <U>
, <T,E>
. ¿Son todos iguales o representan algo diferente?
4. Lista <Objeto>
Esto da el error "El método test(List<Object>)
no es aplicable para el argumento List<String>
":
public static void test(List<Object> list){
System.out.println(list);
}
Si intento esto, obtengo "No se puede transmitir desde List<String>
a List<Object>
":
test((List<Object>) names);
Estoy confundido. String
es una subclase de Object
, entonces ¿por qué no es List<String>
una subclase de List<Object>
?
2
. Escribo algunos códigos para demostrar esto en2
. tyvm