java - 从通用接口(interface)扩展

标签 java generics inheritance

最后一行有什么问题?

interface I1<T>{}

 class Class1 implements I1{}
 class Class2 extends  Class1 implements I1{}         //valid

 class Class3 implements I1<Number>{}
 class Class4 extends  Class3 implements I1<Number>{}  //valid

 class Class5 implements I1<Number>{}
 class Class6 extends  Class5 implements I1<Integer>{}  //not valid

 class Class7 implements I1{}
 class Class8 extends  Class7 implements I1<Number>{}         // not valid

 class Class9 implements I1<Number>{}
 class Class10 extends  Class9 implements I1{}         //  not valid !!!

为什么我做不到?

我在书上看到了,但是没有对这个东西的解释-仅供引用。

附言

异常文本:

java: GenericsTest.I1 cannot be inherited with different arguments:
<java.lang.Integer> and <java.lang.Number>

最佳答案

理解这个有两点:

  • Java 泛型通常是类型不变的。这意味着,例如,I1<Number>和一个 I1<Integer>是不同的类型。在大多数情况下,它们是不相关的,尽管 Integer 扩展了 Number。
  • 如果一个接口(interface)声明为在父类(super class)上实现,它可以声明为在子类上再次实现。这是多余的,但它是允许的。

现在,不允许实现一个接口(interface)两次,其中接口(interface)的泛型类型不同。

例如,这是不允许的:

class NotAllowed implements I1<String>, I1<Integer> {}

I1 的类型在运行时被删除,所以你不能这样做。在运行时,I1<String> 之间并没有真正的区别。和一个 I1<Integer> .他们都变成了I1 .

你的例子 Class5Class6不允许,原因同上NotAllowed不允许。它两次实现相同的接口(interface),但使用不同的泛型类型。

如果允许,那将是自相矛盾的,因为例如给出以下内容:

interface Face<T> {
    public void method(T t);
}

如果我然后用不同的类型实现它两次,这意味着必须有两个通用类型的实现 method :

class Implementation
implements Face<String>, Face<Integer> {
    @Override
    public void method(String s) {}
    @Override
    public void method(Integer i) {}
}

这是自相矛盾的,因为删除还要求 method 的两种实现将在运行时变得相同。您不能在同一个类中声明具有相同签名的方法,因此这是不允许的。

关于java - 从通用接口(interface)扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22281553/

相关文章:

java - Nashorn 和 Rhino : Splitting strings by whitespace regexp

c# - 使用泛型并在接口(interface)中实现可选字段或选择性地实现接口(interface)?

java - Spring:如何使用泛型在 Spring 配置中注入(inject) ENUM?

c# - 获取类型的继承树

Java 设置窗口的 "Document"

java - Hadoop ClassNotFoundException 与已导入的类

java - 刷新数据库连接

Java 泛型 : How to create a to-n collection with configurable value holder type

ruby-on-rails - 如何从模块中引用的类常量数组元编程方法?

inheritance - Ant属性文件可以定义继承吗?