簡體   English   中英

從泛型類型到相同類型的未經檢查的強制轉換

[英]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;
    }
}

這對我來說沒有意義,因為TU被定義為相同的類型。 問題是什么?

TU未定義為同一類型。 它們都定義為extends A ,這意味着TU可以是實現A接口的無關類。 因此演員表是不安全的。

您可以做的唯一安全轉換是將類型TU引用轉換為類型A 當然,你不需要這樣的演員。 您可以簡單地將它們分配給A類型的變量。

雖然TU擴展了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不為空,這並不總是安全的。 TU有不同的類型:他們是“東西延伸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.

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