Java 中的未經檢查的強制轉換
Java 是一種強制型別安全的程式語言,這意味著我們應該始終指定我們將要儲存或使用的資料型別,並且不能在其中儲存不相容的型別。
例如,我們不能在 String 中儲存 Integer 值,編譯器會丟擲錯誤或警告。與資料型別相關的警告之一是未經檢查的強制轉換。
什麼是 Java 中的未經檢查的強制轉換警告
當我們嘗試將原始型別轉換為引數化型別而不檢查其型別時,會發生未經檢查的強制轉換警告。Java 不鼓勵這種方法,因為引數化型別僅限於指定的型別。
Java 中的引數化型別之一是 HashMap
,它接受兩個引數,即 key
型別和 value
型別。在下面的示例程式碼中,我們建立了一個名為 rawMap
的 HashMap
物件,並將一些值及其鍵放入其中。
當我們編譯這個程式時,會出現一些警告,如下所示。出現前兩個警告是因為我們使用 Map
和 HashMap
引數化類作為原始引數。
最後三個警告是針對程式中每個單獨的 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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn