型の安全性: Object から ~ への未検査キャスト

型の安全性: Object から ~ への未検査キャスト

Java5.0より、警告で「型の安全性: Object から ~ への未検査キャスト」という警告が出るようになりました。

「~」には具体的な総称型が入ります。

例えば、「Map<String,String>」などです。

このエラーを簡単に回避するにはメソッドの上に

@SuppressWarnings("unchecked")

アノテーションを追記します。

以下、例です。

package com.confrage;

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

public class TestMain {
  /**
   * @param args
   */
  @SuppressWarnings("unchecked")
  public static void main(String[] args) {
    Object obj = new Object();
    Map<String, String> map = new HashMap<String, String>();
    map = (Map<String, String>) obj;
  }
}

総称型(ジェネリクス)とは

List<String>やMap<String,String>などの型を言います。

警告の対処方法

このページを参考に(と言うか丸々コピーですが)、一つのautoCastメソッドに対してのみ

@SuppressWarnings(“unchecked”)を付加し、以下のようにObjectクラスを返すメソッドなどに対してラップしてコーディングします。

package co.confrage;

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

public class TestMain {
  /**
   * @param args
   */
  public static void main(String[] args) {
    Object obj = new Object();
    Map<String, String> map = new HashMap<String, String>();
    map = autoCast(obj);// ラップする
  }
  @SuppressWarnings("unchecked")
  public static <T> T autoCast(Object obj) {
    T castObj = (T) obj;
    return castObj;
  }
}

上記はサンプルですが、autoCastメソッドのようなメソッドは共通クラスや親クラスに書いた方が良いです。

オブジェクトをListに変換する例です。

public <T> List<T> castToList(Object target) {
  return objectMapper.convertValue(target, new TypeReference<List<T>>() {});
}

コメント

タイトルとURLをコピーしました