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 Objectnie są w rzeczywistości zbędne. Na przykład <T extends Object & Foo>spowoduje, że Tstanie się on Objectwymazany, podczas gdy wraz z <T extends Foo>nim zostanie Foowymazany. (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.Collectionsklasa JDK ma metodę z tym podpisem:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Objectrzeczywistoś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 Objectklasy.
<? extends Object>
<? extends Object>oznacza, że możesz przekazać Object lub podklasę, która rozszerza Objectklasę.
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:
Objectklasy.