在Java中总是使用“extends”而不是“implements”来定义类型参数的边界是否有特殊的原因?
例如:
public interface C {}
public class A<B implements C>{}
是禁止的,但是
public class A<B extends C>{}
是正确的。原因是什么?
在Java中总是使用“extends”而不是“implements”来定义类型参数的边界是否有特殊的原因?
例如:
public interface C {}
public class A<B implements C>{}
是禁止的,但是
public class A<B extends C>{}
是正确的。原因是什么?
当前回答
答案就在这里:
要声明一个有界类型参数,列出类型参数的名称,后跟extends关键字,再后跟它的上界[…]。注意,在此上下文中,extends在一般意义上用于表示扩展(如类)或实现(如接口)。
所以你知道了,这有点令人困惑,甲骨文知道这一点。
其他回答
答案就在这里:
要声明一个有界类型参数,列出类型参数的名称,后跟extends关键字,再后跟它的上界[…]。注意,在此上下文中,extends在一般意义上用于表示扩展(如类)或实现(如接口)。
所以你知道了,这有点令人困惑,甲骨文知道这一点。
可能是因为对于双方(B和C)来说,只有类型是相关的,而不是实现。 在你的例子中
public class A<B extends C>{}
B也可以是一个接口。"extends"用于定义子接口和子类。
interface IntfSub extends IntfSuper {}
class ClzSub extends ClzSuper {}
我通常认为“Sub扩展Super”是“Sub类似于Super,但具有额外的功能”,而“Clz实现Intf”是“Clz是Intf的实现”。在您的示例中,这将匹配:B类似于C,但具有额外的功能。这里相关的是功能,而不是实现。
基类型可能是一个泛型参数,因此实际类型可能是一个类的接口。考虑:
class MyGen<T, U extends T> {
此外,从客户端代码的角度来看,接口几乎与类难以区分,而对于子类型来说,它很重要。
下面是一个更复杂的例子,说明在哪里允许扩展,以及可能需要什么:
public class A<T1 extends Comparable<T1>>
在<T extends Comparable>中使用" extends "是保证数据类型本身直接实现Comparable,或者扩展实现Comparable的类。您可能已经编写了实现Comparable的另一个类a的子类B,如果您声明您的数据类型<T extends Comparable>,那么在实例化该类时可以使用a或B作为您的数据类型。