Мне действительно сложно понять параметр 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является, таким образом, нижней границей. Самый низкий класс в иерархии наследования