Мне действительно сложно понять параметр wild card. У меня есть несколько вопросов по этому поводу.
-
?
как параметр типа может использоваться только в методах. например: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
. ?
может использоваться только в методах
Обновление 1:
public void printAll(MyList<? super MyClass>){
// code code code
}
В соответствии с книгой Ivor Horton MyList<? super MyClass>
означает, что я могу напечатать MyList
, если у него есть объекты MyClass
или любые интерфейсы или классы, которые он реализует. То есть MyClass
является нижней границей. Это последний класс в иерархии наследования. Это означает, что мое первоначальное предположение было неправильным.
Итак, скажем, если MyClass
выглядит следующим образом:
public class MyClass extends Thread implements ActionListener{
// whatever
}
тогда printAll()
будет печатать, если
1. В списке есть объекты MyClass
2. Есть объекты Thread
или ActionListener
в List
Обновление 2:
Итак, прочитав много ответов на вопрос, вот мое понимание:
-
? extends T
означает любой класс, который расширяетT
. Таким образом, мы имеем в виду детейT
. Следовательно,T
- верхняя граница. Высший класс в иерархии наследования -
? super T
означает любой класс/интерфейс, которыйsuper
отT
. Таким образом, мы имеем в виду всех родителейT
.T
является, таким образом, нижней границей. Самый низкий класс в иерархии наследования