Javagenerics – 为什么“扩展T”允许但不是“实现T”?

我想知道在Java中是否有一个特殊的原因是总是使用“ extends ”而不是“ implements ”来定义types参数的范围。

例:

 public interface C {} public class A<B implements C>{} 

是禁止的,但

 public class A<B extends C>{} 

是正确的。 这是什么原因?

generics约束语言在类的“实现”或“扩展”之间没有语义上的差异。 约束的可能性是'extends'和'super' – 也就是说,这个类是可以分配给另一个(扩展的),还是这个类可以从那个分配(超级)。

答案在这里 :

要声明一个有界的types参数,请列出types参数的名称,后跟extends关键字,后跟其上限 […]。 请注意,在这种情况下,扩展是在一般意义上使用,意味着extends (如在类中)或implements (如在接口中)。

所以你有它,这有点混乱,而且Oracle知道它。

可能因为双方(B和C)只有types是相关的,而不是执行。 在你的例子中

 public class A<B extends C>{} 

B也可以是一个界面。 “extends”用于定义子接口以及子类。

 interface IntfSub extends IntfSuper {} class ClzSub extends ClzSuper {} 

我通常认为'Sub extends Super'是' Sub就像超级 ,但有额外的能力','Clz实现Intf'是' ClzIntf的实现'。 在你的例子中,这将匹配: B是像C ,但有额外的function。 这些function在这里是相关的,而不是实现。

这里有一个更多的例子,其中扩展是允许的,可能是你想要的:

public class A<T1 extends Comparable<T1>>

基types可能是generics参数,所以实际的types可能是一个类的接口。 考虑:

 class MyGen<T, U extends T> { 

另外,从客户端代码的angular度来看,接口与类几乎是无法区分的,而对于子类来说则是非常重要的。

这是任意使用的术语。 这可能是两种方式之一。 也许语言devise者认为“扩展”是最基本的术语,而“实现”是接口的特例。

但是我认为implements会稍微有点意义。 我认为更多的是参数types不必是inheritance关系,它们可以是任何types的子types关系。

Java术语表expression了类似的观点 。

因为接口只是类,除了没有属性或实现。 关键字“implements”的唯一用法是允许一个类inheritance多个接口,但不允许多个类,我们可以在代码中看到它。 我不知道他们将来是否会详细说明,但这不是必须的。