簡體   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