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 Objectque en realidad no es redundante. Por ejemplo, <T extends Object & Foo>hará Tque se vuelva Objecta borrar, mientras que con <T extends Foo>ello se volverá Fooa 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.Collectionsclase del JDK tiene un método con esta firma:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Objectrealidad 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 Objectclase.
<? extends Object>
<? extends Object>significa que puede pasar un objeto o una subclase que amplía la Objectclase.
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:
Objectclase.