最后一排有什么问题吗?
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 !!!
为什么我做不到呢?
我在书上看到过,但没有对此东西的解释 - 仅供参考。
P.S.
异常文本:
java: GenericsTest.I1 cannot be inherited with different arguments:
<java.lang.Integer> and <java.lang.Number>
理解这一点有两点:
- Java 泛型通常是类型不变的。这意味着,例如,
I1<Number>
and an I1<Integer>
是不同的类型。对于大多数用途,它们是不相关的,尽管 Integer 扩展了 Number。
- 如果一个接口被声明为在超类上实现,则可以再次声明它在子类上实现。这是多余的,但也是允许的。
现在,不允许的是两次实现一个接口,其中接口的泛型类型不同。
例如,这是不允许的:
class NotAllowed implements I1<String>, I1<Integer> {}
的类型I1
在运行时被擦除,所以你不能这样做。在运行时,两者之间没有真正的区别I1<String>
and an I1<Integer>
。他们俩都变得只是I1
.
你的例子Class5
and Class6
与上述相同的原因不允许NotAllowed
不允许。它两次实现相同的接口,但具有不同的泛型类型。
如果允许的话,这将是自相矛盾的,因为例如给出以下内容:
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
在运行时将变得相同。您不能在同一个类中声明具有相同签名的方法,因此这是不允许的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)