为什么<! - ?扩展接口 - >而不是<! - ?实现接口 - >

时间:2014-10-13 11:19:55

标签: java generics interface

我有以下代码:

ArrayList<? extends IValues> valuesList

IValuesinterface。 该列表中填充了implement IValues接口的类/对象。 我理解这个列表中每个对象的概念必须履行它们实现的接口所规定的合同。 为什么java语言没有这样做:

ArrayList<? implements IValues> valuesList

?这对用户来说会更清楚,不是吗?

4 个答案:

答案 0 :(得分:7)

这就是Generics在Java中的设计方式。

请注意,此处也使用了super关键字,但它与Generics 之外的具有完全不同的含义。

答案 1 :(得分:4)

在这种情况下,使用哪个关键字的语法选择很可能是任意的。它只是一个标记,表明类型参数必须是IValues的子类型。这是用extends表示继承,implements表示接口。

我个人认为最好为类和接口使用一个关键字而不是两个不同的关键字。 extends是一个不错的选择,特别是因为你也在接口中使用它:

interface ISpecialValues extends IValues {
    ...
}

答案 2 :(得分:1)

对于extendsimplements几乎没有什么意义,因为在任何一种情况下,Java 5之前熟悉的含义都不适用。类比的含义实际上是巧合,强迫语言设计者强烈限制不引入新的关键词。

答案 3 :(得分:0)

表达式的目的是确定类/接口是否继承自IValues(或其他类/接口)。我猜他们不会使用关键字implements,因为关键字extendsimplements都可以达到同样的目的。

关键字extendssuper用于标识类/接口是否分别是其他类的子类或基类。