Ho visto il carattere jolly usato prima per indicare qualsiasi oggetto, ma recentemente ho visto un uso di:
<? extends Object>
Poiché tutti gli oggetti estendono Object, questi due usi sono sinonimi?
Ho visto il carattere jolly usato prima per indicare qualsiasi oggetto, ma recentemente ho visto un uso di:
<? extends Object>
Poiché tutti gli oggetti estendono Object, questi due usi sono sinonimi?
Risposte:
<?>
e <? extends Object>
sono anche, come ti aspetteresti.
Ci sono alcuni casi con generici in cui extends Object
non è effettivamente ridondante. Ad esempio, <T extends Object & Foo>
causerà T
a diventare Object
sotto cancellatura, mentre con <T extends Foo>
diventerà Foo
sotto cancellatura. (Questo può essere importante se stai cercando di mantenere la compatibilità con un'API pre-generica utilizzata Object
.)
Fonte: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; spiega perché la java.util.Collections
classe JDK ha un metodo con questa firma:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
realtà è significativo. Se mi sono sbagliato, mi scuso. Spero che possa interessare almeno altre persone che incontrano la tua domanda.
Anche se <?>
dovrebbe essere una scorciatoia <? extend object>
, c'è una piccola differenza tra i due.
<?>
è reificabile mentre <? extend object>
non lo è. Il motivo per cui lo hanno fatto è per rendere più facile distinguere il tipo riconfigurabile. Tutto ciò che sembra <? extends something>
, <T>
, <Integer>
sono nonreifiable.
Ad esempio, questo codice funzionerebbe
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
ma questo dà un errore
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
per maggiori informazioni leggi i generici e le raccolte Java di Maurice Naftalin
<?>
è una scorciatoia per <? extends Object>
. Puoi leggere sotto il link condiviso per maggiori dettagli.
<?>
"?"
denota qualsiasi tipo sconosciuto, può rappresentare qualsiasi tipo nel codice per. Utilizza questo carattere jolly se non sei sicuro del tipo.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Nota: <?>
significa qualsiasi cosa. Quindi può accettare tipi che non sono ereditati dalla Object
classe.
<? extends Object>
<? extends Object>
significa che puoi passare un oggetto o una sottoclasse che estende la Object
classe.
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 - utilizzato per indicare il tipo
E - utilizzato per indicare l'elemento
K - chiavi
V - valori
N - per i numeri
Rif:
Object
classe.