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'是' Clz是Intf的实现'。 在你的例子中,这将匹配: 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多个接口,但不允许多个类,我们可以在代码中看到它。 我不知道他们将来是否会详细说明,但这不是必须的。