gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:55:57 24 4
gpt4 key购买 nike

最后一行有什么问题?

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com