Widziałem wcześniej używany symbol wieloznaczny oznaczający dowolny obiekt - ale ostatnio widziałem użycie:
<? extends Object>
Ponieważ wszystkie obiekty rozszerzają Object, czy te dwa zastosowania są synonimami?
Widziałem wcześniej używany symbol wieloznaczny oznaczający dowolny obiekt - ale ostatnio widziałem użycie:
<? extends Object>
Ponieważ wszystkie obiekty rozszerzają Object, czy te dwa zastosowania są synonimami?
Odpowiedzi:
<?>
i <? extends Object>
są synonimami, jak można się spodziewać.
Istnieje kilka przypadków, w których leki generyczne extends Object
nie są w rzeczywistości zbędne. Na przykład <T extends Object & Foo>
spowoduje, że T
stanie się on Object
wymazany, podczas gdy wraz z <T extends Foo>
nim zostanie Foo
wymazany. (Może to mieć znaczenie, jeśli starasz się zachować zgodność z używanym przedgenerycznym interfejsem API Object
).
Źródło: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; wyjaśnia, dlaczego java.util.Collections
klasa JDK ma metodę z tym podpisem:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
rzeczywistości ma znaczenie. Jeśli się pomyliłem, przepraszam. Miejmy nadzieję, że zainteresują go przynajmniej inne osoby, które napotkają Twoje pytanie.
Chociaż <?>
ma to być skrót <? extend object>
, istnieje między nimi niewielka różnica.
<?>
jest reifable, podczas gdy <? extend object>
nie jest. Powodem, dla którego to zrobili, jest ułatwienie rozróżnienia typów reifiable. Wszystko, co wygląda <? extends something>
, <T>
, <Integer>
są nonreifiable.
Na przykład ten kod zadziała
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
ale to daje błąd
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
Aby uzyskać więcej informacji, przeczytaj artykuł generyczny i kolekcje Java autorstwa Maurice'a Naftalina
<?>
jest skrótem dla <? extends Object>
. Możesz przeczytać poniżej udostępniony link, aby uzyskać więcej informacji.
<?>
"?"
oznacza dowolny nieznany typ, może reprezentować dowolny typ w kodzie. Użyj tego symbolu wieloznacznego, jeśli nie masz pewności co do typu.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Uwaga: <?>
oznacza cokolwiek. Może więc akceptować typy, które nie są dziedziczone z Object
klasy.
<? extends Object>
<? extends Object>
oznacza, że możesz przekazać Object lub podklasę, która rozszerza Object
klasę.
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 - używany do oznaczenia typu
E - używany do oznaczenia elementu
K - klucze
V - wartości
N - dla liczb
Ref:
Object
klasy.