最后一行有什么问题?
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
.
你的例子 Class5
和 Class6
不允许,原因同上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/