【发布时间】:2013-11-16 17:22:04
【问题描述】:
我真的很难理解通配符参数。我对此有几个问题。
?作为类型参数只能在方法中使用。例如: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() 将打印 if
1.列表中有MyClass的对象
2.List中有Thread或ActionListener的对象
更新 2:
所以,在阅读了这个问题的许多答案之后,这是我的理解:
? extends T表示任何扩展T的类。因此,我们指的是T的子代。因此,T是上限。继承层次结构中最上层的类? super T表示super的super的任何类/接口。因此,我们指的是T的所有父母。T因此是下限。继承层次结构中最底层的类
【问题讨论】:
-
几乎可以肯定你检查过这个,但如果你还没有,this link 可以为你提供一些启示。
-
A
MyList<? super MyClass>也将接受MyList<java.lang.Object>。不要拘泥于“列表中”的内容。声明是关于可以传递哪些类型。由于printAll(MyList<? super MyClass>)也将接受MyList<Object>,因此MyList<Object>甚至可能包含JButton,因为JButton实例也是Object的实例。 -
@Holger MyClass 的所有超类/接口开始掌握它。
标签: java generics subclass superclass