Понимание верхних и нижних границ? в Java
Мне действительно тяжело понять подстановочный знак. У меня есть несколько вопросов по этому поводу.
?
в качестве параметра типа можно использовать только методы. например:printAll(MyList<? extends Serializable>)
Я не могу определить классы с?
в качестве параметра типа.
Я понимаю верхнюю границу?
. printAll(MyList<? extends Serializable>)
означает: "printAll
распечатаетMyList
если у него есть объекты, которые реализуютSerialzable
интерфейс."
У меня есть небольшая проблема сsuper
. printAll(MyList<? super MyClass>)
означает: "printAll
распечатаетMyList
если у него есть объектыMyClass
или любой класс, который расширяетсяMyClass
(потомкиMyClass
)."
Поправь меня, где я ошибся.
Короче толькоT
или жеE
или жеK
или жеV
или жеN
может использоваться в качестве параметров типа для определения общих классов.?
может использоваться только в методах
public void printAll(MyList<? super MyClass>){
// code code code
}
Согласие с книгой Ивор Хортон,MyList<? super MyClass>
означает, что я могу напечататьMyList
если у него есть объектыMyClass
или любой из интерфейсов или классов, которые это реализует. Это,MyClass
этонижняя граница, Это последний класс в иерархии наследования. Это означает, что мое первоначальное предположение было неверным.
Так скажи, еслиMyClass
выглядит как:
public class MyClass extends Thread implements ActionListener{
// whatever
}
тогда,printAll()
напечатает, если
1. Есть объектыMyClass
в списке
2. Есть объектыThread
или жеActionListener
вList
Итак, после прочтения многих ответов на вопрос, вот мое понимание:
? extends T
означаетлюбой класс, который расширяетсяT
, Таким образом, мы имеем в видудетиT
, Следовательно,T
это верхняя граница. Самый верхний класс в иерархии наследования
? super T
означаетлюбой класс / интерфейс, которыйsuper
изT
, Таким образом, мы имеем в виду всеродителиT
. T
таким образом, нижняя граница. Самый нижний класс в иерархии наследования