[英]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.