1.
?
作为类型参数只能用在方法中,例如:printAll(MyList<? extends Serializable>)
。我不能定义带有?
作为类型参数的类。2. 我理解
?
的上限。例如:printAll(MyList<? extends Serializable>)
的意思是:“如果MyList
中包含实现Serializable
接口的对象,则printAll
将打印MyList
。” 我对super
有点困惑。例如:printAll(MyList<? super MyClass>)
的意思是:“如果MyList
中包含MyClass
或任何扩展MyClass
(MyClass
的后代)的类的对象,则printAll
将打印MyList
。”请纠正我错误的地方。
简而言之,只有
T
、E
、K
、V
或N
可以用作定义泛型类的类型参数。?
只能用在方法中。更新1:
public void printAll(MyList<? super MyClass>){
// code code code
}
根据Ivor Horton的书所述,
MyList<? super MyClass>
表示如果MyList
有MyClass
对象或其实现的任何接口或类,则可以打印MyList
。也就是说,MyClass
是下限。它是继承层次结构中的最后一个类。这意味着我的初始假设是错误的。因此,假设
MyClass
如下:public class MyClass extends Thread implements ActionListener{
// whatever
}
然后,
printAll()
将会打印以下内容:1. 列表中有
MyClass
的对象2. 列表中有
Thread
或ActionListener
的对象更新2: 所以,在阅读了许多问题的答案之后,这是我的理解:
? extends T
意味着任何继承T
的类。因此,我们指的是T
的子类。因此,T
是上限。继承层次结构中最高的类? super T
意味着任何T
的父类/接口。因此,我们指的是所有T
的父类。T
因此是下限。继承层次结构中最低的类
MyList<? super MyClass>
也会接受MyList<java.lang.Object>
。不要局限于“列表中的内容”。声明是关于可以传递哪些类型的。由于printAll(MyList<? super MyClass>)
也会接受MyList<Object>
,因此MyList<Object>
可能甚至包含一个JButton
,因为JButton
实例也是Object
的实例。 - Holger