理解Java泛型中对?的上界和下界 注意:本文中的内容是关于Java泛型中对?的上界和下界的解释。
理解Java泛型中对?的上界和下界 注意:本文中的内容是关于Java泛型中对?的上界和下界的解释。
我真的很难理解通配符参数。我有几个关于这个问题的问题。
1. 类型参数中的?
只能在方法中使用,例如:printAll(MyList extends Serializable>)
,我不能使用?
来定义类。
2. 我理解?
的上界。例如:printAll(MyList extends Serializable>)
的意思是:“如果MyList
中有实现Serializable
接口的对象,printAll
将会打印MyList
”。
3. 我对super
有些困惑。例如:printAll(MyList super MyClass>)
的意思是:“如果MyList
中有MyClass
或其子类的对象(MyClass
的后代),printAll
将会打印MyList
”。
请纠正我哪里错了。
简而言之,只有T
、E
、K
、V
或N
可以作为用于定义泛型类的类型参数。而?
只能在方法中使用。
更新1:
public void printAll(MyList super MyClass>){ // 代码 }
根据Ivor Horton的书,MyList super MyClass>
的意思是,如果MyList
中有MyClass
或其实现的任何接口或类的对象,我可以打印MyList
。也就是说,MyClass
是一个下界。它是继承层次结构中的最后一个类。这意味着我的初始假设是错误的。
假设MyClass
如下:
public class MyClass extends Thread implements ActionListener{ // 任何内容 }
那么,printAll()
将会在以下情况下打印:
1. 列表中有MyClass
的对象;
2. 列表中有Thread
或ActionListener
的对象。
更新2:
经过阅读这个问题的众多答案后,我对此有了一些了解:
1. ? extends T
表示任何继承自T
的类。因此,我们是在引用T
的子类。因此,T
是上界。继承层次结构中最高的类。
2. ? super T
表示任何是T
的超类/接口。因此,我们是在引用T
的所有父类。因此,T
是下界。继承层次结构中最低的类。