簡體   English   中英

具有有界通配符的Java Generic

[英]Java Generic with bounded wildcards

類聲明之間有什么區別

public abstract class Super1<T extends Super1<T>> {...}  

public abstract class Super2<T extends Super2<? super T>> {...}

使用第一種方法,我能夠創建一個子類(類似於Java中的Enum類型)

public class Sub1 extends Super1<Sub1> {...}

但是我想知道是否有可能像第二類這樣的超類聲明..,它有什么意義,但我無法創建像

public class Sub2 extends Super2<Object> {...}

我認為Object可以用作T ??的超類型 我能想到的另一種形式是

public abstract class Super3<T extends Super3<? extends T>>

我正在嘗試學習泛型,任何幫助表示贊賞。

當您處理具有繼承的 自引用泛型類型時 ,這些類型的聲明通常會出現。 這里的關鍵字是 - 自引用繼承

讓我們通過一個例子來理解這一點。 假設我們有一類Car ,其實現Comparable<Car> ,和子類Car - Mercedes

class Car implements Comparable<Car> { ... }
class Mercedes extends Car { }

現在,你也希望Mercedes具有可比性,所以你可能會認為讓我們在那里實現一個Comparable<Mercedes> ,你做到了:

class Mercedes extends Car implements Comparable<Mercedes> { }

..而且你有錯誤的地方。 問題是,現在Mercedes類實現了Comparable<Car>Comparable<Mercedes> ,這是不允許的。

繼續閱讀:

因此,您從那里刪除Comparable<Mercedes> 現在你離開Mercedes類實現Comparable<Car>

然后你創建一個類,它使用自引用類型參數,如下所示:

class Garage<T extends Comparable<T>> { }

在創建一個實例,同時使用CarMercedes ,你會這樣做:

Garage<Car> carComp = new Garage<Car>();
Garage<Mercedes> mercedesComp = new Garage<Mercedes>();

你能發現錯誤嗎? 是的,它在第二個聲明中。 不能使用Mercedes類型參數,因為它不滿足邊界T extends Comparable<T> Mercedes實施了Comparable<Car> 那現在該怎么辦?

這是宣言的使用。 讓我們把你的班級Garage變成這樣的東西:

class Garage<T extends Comparable<? super T>> { }

..然后你的2實例化將成功通過,因為現在Mercedes滿足了界限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM