Es complicado ...
Para cualquier tipo de variable T
, la especificación dice http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4
Cada variable de tipo ... tiene un límite. Si no se declara límite para una variable de tipo, se asume Object.
Uno podría pensar que es verdad para los comodines también, y ?
debe ser sólo una forma rápida para ? extends Object
.
Sin embargo, al buscar a través de las especificaciones, no hay evidencia de que un comodín deba tener un límite superior (o un límite inferior). El "ilimitado" ?
se trata consistentemente distinto de los comodines delimitados.
podríamos deducir de las reglas de tipificación, que List<?>
y List<? extends Object>
son subtipos de uno al otro, es decir, que son básicamente del mismo tipo.
Pero la especificación las trata por separado, sin embargo. Por ejemplo http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7List<?>
es un tipo reifiable, pero no es List<? extends Object>
, lo que significa
// ok
List<?>[] xx = {};
// fail
List<? extends Object>[] yy = {};
// ok
boolean b1 = (y instanceof List<?>);
// fail
boolean b2 = (y instanceof List<? extends Object>);
No entiendo por qué sin embargo. Parece perfectamente correcto decir que un comodín debe tener un límite superior y un límite inferior, por defecto es Object
y null type
.
¡Guau! Lo perdí por completo. – notnoop
Hawtin == smrt. – orbfish
el ejemplo compila en javac 7 – irreputable