2010-08-22 24 views
11

Simplemente no entiendo esto.Sin procesar a <? extends Object>

List list = new ArrayList(); 
List <? extends Object> list1 = list; // unchecked conversion warning. 

Desde Object es la más alta cota superior en Java, no veo ninguna razón por la advertencia es que hay.

Actualización 1:

Con respecto a la respuesta de AKF:

entiendo perfectamente lo que está diciendo. Eso ya lo se. Pero < ? extends Object> es el límite superior más alto. Lo que significa que tiene cualquier tipo que desee. Básicamente <?> == <? extends Object>.

Usted puede intentar esto en su código y verá <?> == <? extends Objects>

Actualización 2:

Con respecto a Sheng's answer:

List list = new ArrayList(); 
List.add("a"); 
List <? extends Runnable> list1 = list; //warning here 

Por qué ninguna advertencia aquí?

List <?> list2 = list; // No warning here 

Actualización 3:

Sólo estoy revisar lo anterior y todavía desconcertado.

Dado que se permite la siguiente por el compilador:

  1. List a = new ArrayList();

  2. List <?> b = a;

  3. List <? extends Object> c = a; // with warning of course

    for (Object obj : b) {} 
    // I don't agree with your statements above that &lt;?&gt; cannot be 
    
    // written in the for (:) loop as shown here 
    for (Object obj : c) {} 
    

Ambos están permitidos. Así que todavía no entiendo por qué la advertencia sin control cuando assiging prima para <? extends Object>

+5

La diferencia es que raw significa * ningún tipo especificado * y ' 'es una definición de tipo delimitada específica. Por lo tanto, de * ningún tipo * a * algún tipo * esta es una conversión no verificada. –

+0

Entonces por qué Lista list2 = list; // trabajos. No hay advertencia aquí. tampoco asigna ningún tipo a algún tipo (solo la diferencia entre y es que el primero no tiene límites y el último está limitado) – yapkm01

Respuesta

1

Si estoy pensando correctamente, entonces por defecto el compilador supone que quiere decir esto

List<?> list = new ArrayList(); 

El? significa que puede tener cualquier tipo genérico que desee. Esta es la razón por

List list = new ArrayList(); 
List <?> list2 = list 

obras, ya que para el compilador que son la misma cosa

Sin embargo, al hacer esto

List<?> list = new ArrayList(); 
List<? extends Object> list2 = list 

Estás limitar su alcance. Como está limitando el alcance, recibe una advertencia. Sí, sé que no piensas que lo eres, pero eres el compilador.Si está absolutamente seguro de que sabe lo que está haciendo, simplemente ignórelo o suprímalo

0

Suponga que utilizamos Runnable en lugar de Object en la lista1. Es compilar bien, pero el error de tiempo de ejecución:

List list = new ArrayList(); 
list.add("a"); 
List <? extends Runnable> list1 = list; 
for(Runnable o:list1){ //Runtime exception-> java.lang.ClassCastException 
    o.run(); 
} 

El caso muestra el posible problema, esta es la razón por la advertencia aquí.

Pero su IDE simplemente comprueba la sintaxis List <? extends SomeType>, sin importar SomeType es Object u otra cosa.

0

Creo que esto sucede debido a la forma en que Java maneja los comodines delimitados, en esa lista <? Extiende el objeto > no es lo mismo ni una subclase de la lista

Originalmente el concepto me resulta algo confuso, y encontré que el documento Generics in the Java Programming Language es extremadamente útil para comprender específicamente este tipo de genéricos.

+0

Le falta algo de formato, creo ... –

0

Creo que Shengyuanl Lu ya lo ha explicado con precisión. He de añadir que cada vez que vea una cosa así, acaba de recordar estos dos puntos siguientes:

  1. No se puede simplemente emitidos un recipiente de "cualquier tipo" a un contenedor de "tipo acotada" (no importa si el el primero está limitado al tipo de objeto).
  2. Cada vez que lo hace, se crea "la contaminación del montón" (consulte la Descripción de Angelika Langer Java Generics FAQ)
2

This question, y en particular this answer, tiene algunos detalles más sobre las diferencias entre ? y ? extends Object. Todavía no he encontrado nada que diga por qué recibe una advertencia asignando desde List a List<? extends Object>, sin embargo.

Cuestiones relacionadas