[英]Why Java generics allows wildcard with higher upper bound than that of type parameter's?
這是我試圖了解的編譯器行為的簡化版本:
class Scratch {
public static void main(String[] args) {
HouseCat<? extends Mammal> hcat = new Tabby();
//HouseCat<Mammal> won't work, compiler catches incorrect type parameter bound
HouseCat<CrazyHouseCat> crazyCat = new Tabby();
}
}
interface Mammal<T extends Mammal> extends Comparable<T>{
T cloneInstance();
}
interface Feline<T extends Feline> extends Mammal<T>{}
interface HouseCat <T extends HouseCat> extends Feline<T>{}
interface CrazyHouseCat<T extends CrazyHouseCat> extends HouseCat<T>{
void pushStuffOverTvStand();
}
class Tabby implements CrazyHouseCat<CrazyHouseCat>{
@Override
public CrazyHouseCat cloneInstance() {
return null;
}
@Override
public void pushStuffOverTvStand() {
}
@Override
public int compareTo(CrazyHouseCat o) {
return 0;
}
}
在上面的代碼段中, HouseCat<? extends Mammal>
extended HouseCat<? extends Mammal>
是類型比HouseCat接口所允許的類型更廣泛的引用,即: HouseCat<T extends HouseCat>
如果我嘗試做類似HouseCat<Long>
則編譯器會告訴我Long
不滿足類型參數的約束。 好吧,不是<? extends Mammal>
<? extends Mammal>
,至少有可能。
編譯器不允許我創建一個違反類型參數T
約束的實例,但是我對使用Mammal
作為參考上限的行為感到困惑。 ( HouseCat
, Mammal
]之間存在無效的類型范圍,因此編譯器為何不拒絕該引用定義?
澄清:我的問題不是關於通配符的意思?
。 我在問為什么編譯器允許使用比參數化類型的定義所允許的類型更大的類型來定義對參數化類型實例的引用。 提到的問題並未解決此特定情況,而是關於通配符的含義。 我的問題是關於通配符的有效范圍,編譯器似乎沒有強制執行該范圍。
這看起來像是回答你的問題。 基本上是HouseCat<? extends Mammal>
HouseCat<? extends Mammal>
允許創建HouseCat<[insert type that extends Mammal here]>
。 全部<? extends Mammal>
<? extends Mammal>
確實是一個通用類。 在您的示例中,我看不到您為什么會嘗試以這種方式進行操作,但是我希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.