[英]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>
其中U
是T
的子类。 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.