Java でのチェックされていないキャスト
Java は型の安全性を強制するプログラミング言語です。つまり、格納または使用するデータの型を常に指定する必要があり、互換性のない型を格納することはできません。
たとえば、整数値を文字列に格納することはできず、コンパイラはエラーまたは警告をスローします。データ型に関連する警告の 1つは、チェックされていないキャストです。
Java でチェックされていないキャスト警告とは何ですか
チェックされていないキャスト警告は、型をチェックせずに raw 型をパラメーター化された型にしようとすると発生します。パラメータ化された型は指定された型のみに制限されているため、Java はこのメソッドを推奨していません。
Java のパラメーター化されたタイプの 1つは、HashMap
です。これは、key
タイプと value
タイプの 2つのパラメーターを取ります。以下のサンプルコードでは、rawMap
と呼ばれる HashMap
のオブジェクトを作成し、その中にキーを含むいくつかの値を配置します。
このプログラムをコンパイルすると、以下に示すようないくつかの警告が表示されます。最初の 2つの警告は、Map
および HashMap
パラメーター化されたクラスを raw として使用しているために発生します。
最後の 3つの警告は、型を指定したり型をチェックしたりせずに値を入力するため、プログラム内のすべての個々の 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
はまだ raw 型として使用されていますが、コンパイルすると警告が消えることに注意してください。
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'
この問題に対するもう 1つの明らかな解決策は、パラメーター化された型 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