我有以下代码:
ArrayList<? extends IValues> valuesList
IValues
是interface
。
该列表中填充了implement
IValues
接口的类/对象。
我理解这个列表中每个对象的概念必须履行它们实现的接口所规定的合同。
为什么java语言没有这样做:
ArrayList<? implements IValues> valuesList
?这对用户来说会更清楚,不是吗?
答案 0 :(得分:7)
这就是Generics在Java中的设计方式。
请注意,此处也使用了super
关键字,但它与Generics 之外的具有完全不同的含义。
答案 1 :(得分:4)
在这种情况下,使用哪个关键字的语法选择很可能是任意的。它只是一个标记,表明类型参数必须是IValues
的子类型。这是用extends
表示继承,implements
表示接口。
我个人认为最好为类和接口使用一个关键字而不是两个不同的关键字。 extends
是一个不错的选择,特别是因为你也在接口中使用它:
interface ISpecialValues extends IValues {
...
}
答案 2 :(得分:1)
对于extends
或implements
几乎没有什么意义,因为在任何一种情况下,Java 5之前熟悉的含义都不适用。类比的含义实际上是巧合,强迫语言设计者强烈限制不引入新的关键词。
答案 3 :(得分:0)
表达式的目的是确定类/接口是否继承自IValues
(或其他类/接口)。我猜他们不会使用关键字implements
,因为关键字extends
或implements
都可以达到同样的目的。
关键字extends
和super
用于标识类/接口是否分别是其他类的子类或基类。