para responder a su segunda pregunta, sí, se puede emitir el List<?>
como List<Object>
o una List<T>
de cualquier tipo, ya que el parámetro ?
(Comodín) indica que la lista contiene una colección homogénea de un cualquierObject
. Sin embargo, no hay forma de saber en compilación qué es el type
, ya que solo forma parte de la API exportada, lo que significa que no puede ver lo que se está insertando en el List<?>
.
Así es como usted haría el reparto:
List<?> wildcardList = methodThatReturnsWildcardList();
// generates Unchecked cast compiler warning
List<Object> objectReference = (List<Object>)wildcardList;
En este caso se puede ignorar la advertencia porque para que un objeto para ser usado en una clase genérica que debe ser un subtipo de Object
. Vamos a pretender que estamos tratando de lanzar esto como List<Integer>
cuando en realidad contiene una colección de String
s.
// this code will compile safely
List<?> wildcardList = methodThatReturnsWildcardList();
List<Integer> integerReference = (List<Integer>)wildcardList;
// this line will throw an invalid cast exception for any type other than Integer
Integer myInteger = integerRefence.get(0);
Recuerde: los tipos genéricos se eliminan en tiempo de ejecución. No sabrá qué contiene la colección, pero puede obtener un elemento y llamar al .getClass()
para determinar su tipo.
Class objectClass = wildcardList.get(0).getClass();
bien, si ustedes dicen que '' Lista > no se puede instanciar, entonces ¿cómo es que el método puede devolver? – Chris
Vale la pena señalar que 'Arrays.asList (T ... a)' devuelve una 'Lista'. Puede inicializar 'List' con' List