[英]Casting to generic subtypes of a generic class
假設我有這個:
class Base<T> {}
class Derived<T> extends Base<T> {}
然后在我的代碼中,我可以安全地進行鑄造,而不會發出如下警告:
public <T> void foo(Base<T> base) {
Derived<T> f = (Derived<T>) base; // fine, no warning
}
很好 但是,如果派生類具有更多類型參數,它將不再起作用:
class Base<T> {}
class Derived<T, U> extends Base<T> {}
public <T> void foo(Base<T> base) {
Derived<T, ?> f = (Derived<T, ?>) base; // unchecked warning!
}
這是為什么? 有什么明顯的我想念的地方嗎?
對我來說,這似乎是一個錯誤。 從JLS§5.5.2。 已檢查的演員表和未檢查的演員表 :
除非至少滿足以下條件之一,否則不檢查從類型S到參數化類型(第4.5節)T的強制轉換:
S <:T
T的所有類型參數(第4.5.1節)都是無界通配符
T <:S和S除了T的類型參數中不包含X的類型參數以外,沒有T的子類型X。
給定類型Base<T>
和Derived<T, ?>
分別為S
和T
,前兩個條件顯然不成立。
這使得第三個條件-這將不成立,如果我們能夠確定的亞型Base<T>
除Derived<T, ?>
其類型參數不包含在該類型參數Derived<T, ?>
。 如果警告是正確的,則必須存在這樣的子類型,但我無法確定一個。 例如, Derived<?, ?>
不起作用,因為它不是Base<T>
的子類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.