He visto el comodín usado antes para referirse a cualquier objeto, pero recientemente vi un uso de:
<? extends Object>
Dado que todos los objetos extienden Object, ¿estos dos usos son sinónimos?
He visto el comodín usado antes para referirse a cualquier objeto, pero recientemente vi un uso de:
<? extends Object>
Dado que todos los objetos extienden Object, ¿estos dos usos son sinónimos?
Respuestas:
<?>
y <? extends Object>
son sinónimos, como era de esperar.
Hay algunos casos con genéricos en los extends Object
que en realidad no es redundante. Por ejemplo, <T extends Object & Foo>
hará T
que se vuelva Object
a borrar, mientras que con <T extends Foo>
ello se volverá Foo
a borrar. (Esto puede ser importante si está intentando mantener la compatibilidad con una API pregenérica que se utilizó Object
).
Fuente: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; explica por qué la java.util.Collections
clase del JDK tiene un método con esta firma:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
realidad es significativo. Si me equivoqué, me disculpo. Con suerte, será de interés para otras personas que se encuentren con su pregunta, al menos.
Aunque <?>
se supone que es un atajo para <? extend object>
, hay una pequeña diferencia entre los dos.
<?>
es confiable mientras <? extend object>
que no lo es. La razón por la que hicieron esto es para que sea más fácil distinguir los tipos confiables. Cualquier cosa que se parece <? extends something>
, <T>
, <Integer>
son nonreifiable.
Por ejemplo, este código funcionaría
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
pero esto da un error
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
para obtener más información, lea las colecciones y genéricos de Java de Maurice Naftalin
<?>
es una abreviatura de <? extends Object>
. Puede leer el enlace compartido a continuación para obtener más detalles.
<?>
"?"
denota cualquier tipo desconocido. Puede representar cualquier tipo en el código. Utilice este comodín si no está seguro del tipo.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Nota: <?>
significa cualquier cosa. Por lo tanto, puede aceptar tipos que no se heredan de la Object
clase.
<? extends Object>
<? extends Object>
significa que puede pasar un objeto o una subclase que amplía la Object
clase.
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T - usado para denotar el tipo
E - usado para denotar el elemento
K - teclas
V - valores
N - para números
Ref:
Object
clase.