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:
List a = new ArrayList();
List <?> b = a;
List <? extends Object> c = a; // with warning of course
for (Object obj : b) {} // I don't agree with your statements above that <?> 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>
La diferencia es que raw significa * ningún tipo especificado * y ' extends Object> '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. –
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 Extends Object> es que el primero no tiene límites y el último está limitado) – yapkm01