簡體   English   中英

僅在通用類型上取消選中投射警告

[英]Unchecked cast warning only on generic type

代碼示例#1:

public class Foo implements Cacheable {
}

public class Fooer {
    void doSomething(Cacheable obj) {
        Foo foo = (Foo) obj; //#1
    }
}

代碼示例#2:

public class GenericFooer<FooClass extends Cacheable> {
    void doSomething(Cacheable obj) {
        FooClass foo = (FooClass) obj; //#2
    }
}

為什么我會在#2的情況下獲得“未經檢查的演員:'可緩存'到'FooClass'”警告但不是#1的情況? 這兩個案例對我來說似乎完全一樣。 我錯過了什么,或者代碼檢查員是否有點破碎?

PS:我正在使用InteliJ IDEA社區版。

PSS:我知道如何繞過這個警告,唯一的問題是為什么它在這里,如果它不在那里。

在這兩種情況下,您都在做一些無法保證的事情。 在實際確定它將是Foo之前​​,你將obj轉換為Foo。 那為什么不同的行為?

在#1的情況下:通過使用強制轉換(Foo),您告訴編譯器相信您 ,Cacheable obj肯定是Foo。 因此編譯器只檢查類層次結構並繼續。 (如果您嘗試在不同的類層次結構之間轉換對象,您將收到錯誤)但是,如果它不是Foo,則在運行時將拋出ClassCastException。

在#2的情況下:泛型本質上被設計為提供更嚴格的類型檢查。 請參閱Java Doc: Java Generics

所以編譯器確保為您提供警告。

另請參閱Generics:Type Erasure

暫無
暫無

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

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