Object型から総称型(ListやMapなど)へキャストする場合、Java 5.0以降では以下の様に記述すると「型の安全性: Object から Map への未検査キャスト」 とコンパイラが警告を表示してきます。
1 2 3 4 5 6 7 8 9 |
/** * <p>[概 要] Mapキャスト</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ public static Map<Integer, String> castMap(Object obj){ Map<Integer, String> map = (Map<Integer, String>)obj; return map; } |
単純に警告を表示させないだけで良いのならメソッドの手前に「@SuppressWarnings(“unchecked”)」を記載すれば良いのですが、それではメソッド内全てで本来チェックが必要な箇所までチェックされなくなってしまうのであまり好ましい方法とは言えません。個人的に一番良いと思われる方法はObject型をキャストする専用メソッドを作成し、その中でのみObject型からListやMapなどの総称型へキャストする方法です。
Javaソース
-
- 総称(Generics)を使用することで、呼出元の期待値に合わせてキャストされます。
1 2 3 4 5 6 7 8 9 10 |
/** * <p>[概 要] 戻り値の型に合わせてキャスト</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ @SuppressWarnings("unchecked") public static <T> T autoCast(Object obj) { T castObj = (T) obj; return castObj; } |
JUnitサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Test public void testAutoCast() { // 準備 Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "abc"); map.put(2, "efg"); map.put(3, "hij"); Object obj = map; // 実行 Map<Integer, String> resultMap = UtilClass1.autoCast(obj); // 検証 assertEquals("文字列が一致していません。", map.get(1), resultMap.get(1)); assertEquals("文字列が一致していません。", map.get(2), resultMap.get(2)); assertEquals("文字列が一致していません。", map.get(3), resultMap.get(3)); } |