Java でのチェックされていないキャスト

Rupam Yadav 2023年10月12日
  1. Java でチェックされていないキャスト警告とは何ですか
  2. @SuppressWarnings を使用して警告を無視する
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 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