Java 中的未經檢查的強制轉換

Rupam Yadav 2023年10月12日
  1. 什麼是 Java 中的未經檢查的強制轉換警告
  2. 使用@SuppressWarnings 忽略警告
Java 中的未經檢查的強制轉換

Java 是一種強制型別安全的程式語言,這意味著我們應該始終指定我們將要儲存或使用的資料型別,並且不能在其中儲存不相容的型別。

例如,我們不能在 String 中儲存 Integer 值,編譯器會丟擲錯誤或警告。與資料型別相關的警告之一是未經檢查的強制轉換。

什麼是 Java 中的未經檢查的強制轉換警告

當我們嘗試將原始型別轉換為引數化型別而不檢查其型別時,會發生未經檢查的強制轉換警告。Java 不鼓勵這種方法,因為引數化型別僅限於指定的型別。

Java 中的引數化型別之一是 HashMap,它接受兩個引數,即 key 型別和 value 型別。在下面的示例程式碼中,我們建立了一個名為 rawMapHashMap 物件,並將一些值及其鍵放入其中。

當我們編譯這個程式時,會出現一些警告,如下所示。出現前兩個警告是因為我們使用 MapHashMap 引數化類作為原始引數。

最後三個警告是針對程式中每個單獨的 put 語句的,因為我們放置值時沒有指定它們的型別或檢查型別;因此,未經檢查的強制轉換警告即將出現。

import java.util.HashMap;
import java.util.Map;

public class Main {
  public static void main(String[] args) {
    Map rawMap = new HashMap();
    rawMap.put("key1", "String1");
    rawMap.put("key2", "String2");
    rawMap.put("key3", "String3");

    System.out.println(rawMap);
  }
}

輸出:

{key1=String1, key2=String2, key3=String3}

警告:

Raw use of parameterized class 'Map'
Raw use of parameterized class 'HashMap'
Unchecked call to 'put(K, V)' as a member of raw type 'java.util.Map'
Unchecked call to 'put(K, V)' as a member of raw type 'java.util.Map'
Unchecked call to 'put(K, V)' as a member of raw type 'java.util.Map'

現在我們知道了實際問題,我們可以討論這個問題的解決方案或變通方法。

使用@SuppressWarnings 忽略警告

如果我們想忽略警告,我們可以使用 @SupressWarnings 註釋。這是一個很好的解決方案,但前提是我們知道將來不會出現有關此警告的問題。

為了使用這個註解,我們傳遞了我們想要抑制的警告,它是 unchecked。我們在生成警告的函式上使用此註釋。

下面是我們在前面的示例中看到的相同程式,但我們在 main() 函式上使用了 @SuppressWarnings 註釋並在其中傳遞 unchecked。請注意,HashMap 仍然被用作原始型別,但是當我們編譯它時警告消失了。

import java.util.HashMap;
import java.util.Map;

public class Main {
  @SuppressWarnings("unchecked")
  public static void main(String[] args) {
    Map rawMap = new HashMap();
    rawMap.put("key1", "String1");
    rawMap.put("key2", "String2");
    rawMap.put("key3", "String3");

    System.out.println(rawMap);
  }
}

輸出:

{key1=String1, key2=String2, key3=String3}

警告:

Raw use of parameterized class 'Map'
Raw use of parameterized class 'HashMap'

這個問題的另一個明顯解決方案是使用引數化型別 HashMap,因為它應該是。在下面的例子中,我們在 HashMap 中指定了鍵的型別和值,警告消失了。

import java.util.HashMap;
import java.util.Map;

public class Main {
  public static void main(String[] args) {
    Map<String, String> rawMap = new HashMap<>();
    rawMap.put("key1", "String1");
    rawMap.put("key2", "String2");
    rawMap.put("key3", "String3");

    System.out.println(rawMap);
  }
}

輸出:

{key1=String1, key2=String2, key3=String3}
作者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn