簡體   English   中英

轉換為泛型類的泛型子類型

[英]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, ?>分別為ST ,前兩個條件顯然不成立。

這使得第三個條件-這將不成立,如果我們能夠確定的亞型Base<T>Derived<T, ?>其類型參數不包含在該類型參數Derived<T, ?> 如果警告是正確的,則必須存在這樣的子類型,但我無法確定一個。 例如, Derived<?, ?>不起作用,因為它不是Base<T>的子類型。

暫無
暫無

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

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