[英]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.