繁体   English   中英

Java 泛型多重边界错误:不能用不同类型继承 arguments

[英]Java generic multiple bounds error:cannot be inherited with different type arguments

写代码的时候想过用泛型多重边界来实现一个问题,但是写完就一直报错:cannot beinherited with different type arguments

我有以下课程:

public class Animal implements Comparable<Animal> {}
public class Dog extends Animal   {}

我还定义了一个 static 方法:

public static <T extends Animal & Comparable<? extends T>> T getMin(List<T> value) { return null;}

我的想法是定义一个泛型,这个泛型必须是Animal的子类,而且这个泛型必须实现Comparable接口,接口的实际参数是Animal及其子类class。

后来我又做了一次尝试,定义了另一个 static 方法:

public static <T extends Animal & Comparable<? super T>> T getMin(List<T> value) { return null;}

我的想法是定义一个泛型,这个泛型必须是Animal的子类,而且这个泛型必须实现Comparable接口,接口的实际参数是Animal及其父class。

令人沮丧的是两种方法都报错: java.lang.Comparable' cannot be inherit with different type arguments: 'Animal' and 'capture

最后,我发现 Animal 和 dog 类需要修改如下,就像 number 及其子类一样:

public class Animal  {}
public class Dog extends Animal implements Comparable<Dog>  {}

但是不明白为什么要这样修改,为什么一开始就报错。

Java 的 generics 只有 Java 编译器知道,但 JVM 不知道。 这称为类型擦除 就 JVM 而言, Comparable<Animal>Comparable<Dog>是同一类型。 JVM 只是认为它们都是Comparable

这是无效的:

<T extends Animal & Comparable<? extends T>>

因为您说T应该同时实现两个接口: Comparable<Animal> (因为Animal实现了Comparable<Animal> )和Comparable<U>其中UT的子类。 T不能同时实现这两个接口,因为虽然它们在编译器看来不同,但运行时认为它们是相同的Comparable

这就是为什么不能让Animal实现Comparable<Animal>Dog实现Comparable<Dog>的原因。 Dog将实现两个在运行时看起来相同的接口!

你可以说:

<T extends Animal & Comparable<Animal>>

但这有点多余...

通过仅使Dog实现Comparable<Dog>T extends Animal不再意味着T implements Comparable<Animal> ,因此您不再说T应该实现 2 个不同的接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM