Zrozumienie górnej i dolnej granicy? w Java Generics
Naprawdę mam trudny czas na zrozumienie parametru dzikiej karty. Mam kilka pytań na ten temat.
?
jako typ parametru można używać tylko w metodach. na przykład:printAll(MyList<? extends Serializable>)
Nie mogę zdefiniować klas za pomocą?
jako parametr typu.
Rozumiem górną granicę?
. printAll(MyList<? extends Serializable>)
znaczy: "printAll
wydrukujeMyList
jeśli ma obiekty, które implementująSerialzable
berło."
Mam trochę problemów zsuper
. printAll(MyList<? super MyClass>)
znaczy: "printAll
wydrukujeMyList
jeśli ma przedmiotyMyClass
lub dowolna klasa, która się rozciągaMyClass
(potomkowieMyClass
)."
Popraw mnie, gdzie poszedłem źle.
Krótko mówiąc, tylkoT
lubE
lubK
lubV
lubN
może być używany jako parametry typu do definiowania klas ogólnych.?
może być używany tylko w metodach
public void printAll(MyList<? super MyClass>){
// code code code
}
Accordint do książki Ivora Hortona,MyList<? super MyClass>
oznacza, że mogę wydrukowaćMyList
jeśli ma przedmiotyMyClass
lub dowolny z interfejsów lub klas, które implementuje. To jest,MyClass
jestDolna granica. Jest to ostatnia klasa w hierarchii dziedziczenia. Oznacza to, że moje początkowe założenie było błędne.
Więc powiedz, jeśliMyClass
wygląda jak:
public class MyClass extends Thread implements ActionListener{
// whatever
}
następnie,printAll()
wydrukuje jeśli
1. Są przedmiotyMyClass
na liście
2. Są przedmiotyThread
lubActionListener
wList
Tak więc, po przeczytaniu wielu odpowiedzi na pytanie, oto moje zrozumienie:
? extends T
znaczykażda klasa, która się rozszerzaT
. Tak więc mamy na myślidzieciT
. Stąd,T
jest górną granicą. Najwyższa klasa w hierarchii dziedziczenia
? super T
znaczykażda klasa / interfejs, który jestsuper
zT
. Mamy zatem na myśli wszystkierodziceT
. T
jest więc dolną granicą. Najniższa klasa w hierarchii dziedziczenia