[英]Unchecked cast from generic type to the same type
以下代碼在 IntelliJ IDEA 中生成警告Unchecked cast: 'T' to 'U'
:
interface A {}
class B<T extends A, U extends A> {
void f() {
final T t = null;
final U u = (U) t;
}
}
這對我來說沒有意義,因為T
和U
被定義為相同的類型。 問題是什么?
T
和U
未定義為同一類型。 它們都定義為extends A
,這意味着T
和U
可以是實現A
接口的無關類。 因此演員表是不安全的。
您可以做的唯一安全轉換是將類型T
或U
引用轉換為類型A
。 當然,你不需要這樣的演員。 您可以簡單地將它們分配給A
類型的變量。
雖然T
和U
擴展了A
,但它們不是同一類型。 因此你不能從一個轉換到另一個。
考慮:
class D implements A {}
class E implements A {}
B<D, E> b;
你不能從 D 投射到 E。
家長:
interface A {
}
孩子:
class B implements A {
}
class C implements A {
}
在上面的例子中,A 是父 B 和 C。
例子:
下面的代碼將正常工作。
A a = new B();
B b = (B)a;
這將觸發類 Cast Exception。
B b = new B();
C c = (C) b;
您不能使用 Siblings 類型進行類型轉換。 這是因為您可能會嘗試訪問可能出現在結果類中的方法/屬性。
同樣的事情可以是字符串,整數,對象。 對象是父對象
Integer 和 String 是 Object 類的子類,但您不能將這些分類。
final T t = null;
final U u = (U) t;
盡管這是未經檢查的,但這實際上是安全的,因為null
可以在沒有ClassCastException
情況下轉換為任何引用類型。
但是,編譯器在轉換非空引用時不會考慮它的值:它只是“一些” T
。 這是一個例子,你,程序員,比編譯器更了解類型,因為你知道t == null
,所以你可以通過添加強制轉換和@SuppressWarnings
合法地要求編譯器信任你。
但是如果t
不為空,這並不總是安全的。 T
和U
有不同的類型:他們是“東西延伸A
”和“擴展的東西(也許是相同的,也許不是) A
”。
為了使這更具體一點,這是一個等效的示例:
class B<T extends Serializable, U extends Serializable> {
U method(T t) {
return (U) t;
}
}
String s = new B<Integer, String>().method(1);
這將因ClassCastException
失敗,因為Integer
不是String
。
如果您不希望它們是不同類型,請刪除其中之一(當然還有演員表)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.