Mam kilka pytań dotyczących ogólnych symboli wieloznacznych w Javie:
Jaka jest różnica między
List<? extends T>
iList<? super T>
?Co to jest ograniczony symbol wieloznaczny, a co nieograniczony symbol wieloznaczny?
java
generics
bounded-wildcard
Pablo Fernandez
źródło
źródło
Odpowiedzi:
W swoim pierwszym pytaniu,
<? extends T>
a<? super T>
przykłady ograniczonych symbole wieloznaczne. Nieograniczony symbol wieloznaczny wygląda<?>
i zasadniczo oznacza<? extends Object>
. To luźno oznacza, że rodzaj ogólny może być dowolnego typu. Ograniczony symbol wieloznaczny (<? extends T>
lub<? super T>
) nakłada ograniczenie na typ, mówiąc, że albo musi rozszerzyć określony typ (<? extends T>
jest to górna granica), albo musi być przodkiem określonego typu (<? super T>
jest znane jako dolna granica) .Samouczki języka Java zawierają całkiem dobre wyjaśnienia dotyczące typów ogólnych w artykułach Symbole wieloznaczne i Więcej zabawy z symbolami wieloznacznymi .
źródło
<? super C>
oznaczałoby to, że twój typ jest ograniczony do czegoś powyżejC
w hierarchii typów. (Przepraszamy za bardzo późną odpowiedź. Wydaje mi się, że nie otrzymaliśmy powiadomień o komentarzach 2 lata temu?)Jeśli masz hierarchię klas A, B jest podklasą A, a C i D obie są podklasą B, jak poniżej
Następnie
Ograniczony symbol wieloznaczny jest taki, jak
? extends B
tam, gdzie B jest jakimś typem. Oznacza to, że typ jest nieznany, ale można na nim umieścić „wiązanie”. W tym przypadku jest ograniczona przez jakąś klasę, która jest podklasą B.źródło
List<? super B>
opisuje jako List akceptuje typ, który jest klasą nadrzędną klasy B ? Dlaczego C i D nie kompilują się hmm?Josh Bloch ma również dobre wyjaśnienie, kiedy używać,
super
orazextends
w tym wykładzie wideo google io, w którym wspomina o mnemoniku Producerextends
Consumersuper
.Ze slajdów prezentacji:
źródło
Może się zdarzyć, że będziesz chciał ograniczyć rodzaje typów, które mogą być przekazywane do parametru typu. Na przykład metoda, która operuje na liczbach, może chcieć akceptować tylko wystąpienia Number lub jej podklasy. Do tego służą parametry typu ograniczonego.
oznacza, że może akceptować wszystkie obiekty, które są w relacji IS- A z MyObject (tj. każdy obiekt będący typem myObject lub możemy powiedzieć dowolny obiekt dowolnej podklasy MyObject) lub obiekt klasy MyObject.
Na przykład:
Następnie,
zaakceptuje tylko MyObject lub elementy podrzędne MyObject (tj. każdy obiekt typu OurObject lub YourObject lub MyObject, ale nie będzie to żaden obiekt z nadklasy MyObject).
źródło
Ogólnie,
Aby umieścić elementy w strukturze, potrzebujemy innego rodzaju symbolu wieloznacznego o nazwie
Wildcards with super
,źródło
Generyczne symbole wieloznaczne są tworzone, aby umożliwić wielokrotne użycie metod działających w kolekcji.
Na przykład, jeśli metoda ma parametr
List<A>
, możemy dać tylkoList<A>
tej metodzie. W pewnych okolicznościach jest to strata dla funkcji tej metody :List<A>
, to powinniśmy mieć możliwość oddaniaList<A-sub>
tej metodzie. (Ponieważ A-sub JEST A)List<A>
, to powinniśmy mieć możliwość oddaniaList<A-super>
tej metodzie. (Ponieważ A JEST A-super)źródło