2012-03-30 5 views
15

Quiero eliminar dos listas: Primero es una lista de enteros. Lo decanto como:¿Por qué es la diferencia en la declaración de listas genéricas?

List<Integer> ints= Arrays.asList(1,2,3); 

Funciona bien.

La segunda es una lista de Objetos. Lo declaro como:

List<Object> objs= Arrays.asList(1,2.13,"three"); 

Pero da un error de eclipse tan pronto como lo escribo. El error es:

Multiple markers at this line 
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
List<Object> 
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for 
     a varargs parameter 

En cambio si escribo

List<Object> objs = Arrays.<Object>asList(1,2.13,"three"); 

Trabaja muy bien.

No puedo averiguar el motivo.

Respuesta

14

Mire this post on stackoverflow.

Argumentos 15.12.2.7 Inferir el tipo basada en argumentos reales

Un supertipo restricción T:> X implica que la solución es uno de supertipos de X. Dado varias de esas limitaciones en T, que pueden intersecta los conjuntos de supertipos implicados por cada una de las restricciones, ya que el parámetro de tipo debe ser un miembro de todos ellos. A continuación, podemos elegir el tipo más específico que se encuentra en la intersección

La intersección tipo más restrictivo entre String, Double y Integer es a la vez las interfaces Comparable y Serializable. Así que cuando se escribe

Arrays.asList(1,2.13,"three"); 

Se infiere T ser implements Comparable<?>, Serializable .A continuación, es como si usted está haciendo

List<Object> objs = new List<T extends Comparable<?>, Serializable> 

Obviamente, esto no está permitido.
Por otra parte, cuando se especifica Object explícitamente usando

Arrays.<Object>asList(1,2.13,"three"); 

ninguna inferencia se hace

+0

Lo tengo. Gracias por extremadamente buena explicación. Esta será una regla de oro para aplicar en caso de tales confusiones. –

2

Uso esto funciona perfecto

List<? extends Object> objs = Arrays.asList(10,20.32,"test"); 

System.out.println(objs); 

Salida: [10, 20,32, prueba]

+3

Eso está bien, pero tenga en cuenta que, en lo que respecta al compilador, 'List ' es * not * lo mismo que 'List ', y el OP puede necesitar una' List ' – Bohemian

+1

-1 Como el OP indica,' Arrays. asList (1,2.13, "three") 'funciona bien.La pregunta era por qué el compilador no puede inferir 'Objeto', no cómo hackear una solución. –

Cuestiones relacionadas