簡體   English   中英

未經檢查的涉及通配符類型的演員表

[英]Unchecked cast involving wildcard types

有人可以解釋為什么這是未經檢查的演員嗎

static void foo(Collection<? extends Number> collection) {
    List<? extends Number> list = (List<? extends Number>) collection;
}

但這不是嗎?

static void bar(List<? extends Number> list) {
    Collection<? extends Number> collection = (Collection<? extends Number>) list;
}

我認為這與捕獲有關,但是我想要一個清晰的解釋。

編輯

我意識到這是一個措辭不佳的問題,正確的答案是“因為List擴展了Collection ”。 但是,在IntelliJ中,它會生成警告,強制轉換為更特定的類型時通常不會得到警告。 從下面的評論看來,這可能只是IntelliJ中的錯誤。 確切的警告在下面的注釋中(由於某些原因,我在這里無法重現)。 我沒有收到以下任何警告

static void foo(Collection<Number> collection) {
    List<Number> list = (List<Number>) collection;
}

static <T> void foo(Collection<T> collection) {
    List<T> list = (List<T>) collection;
}

static void foo(Collection<?> collection) {
    List<?> list = (List<?>) collection;
}

因為從List<? extends Number> List<? extends Number>List<? extends Number> List<? extends Number>是一個下垂的選項,通常需要在運行時檢查對象的類型。 但是,運行時環境無法檢查type參數是否確實是擴展Number的類。 該信息在運行時不可用,Java泛型(“類型參數”)僅存在於靜態Java類型系統中,它們不會影響已編譯的代碼。 因此,關於Collection的唯一可以在運行時檢查的是,如果CollectionList

另一種情況是簡單的轉換,不需要任何運行時信息。 您可以在編譯時檢查該強制轉換將始終有效。 因此,在運行時缺少有關類型參數的信息是無關緊要的。

暫無
暫無

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

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