ジェネリクスと同じくJDK1.5で導入された、Class.cast()について調べてみた。
Class.cast()とは
うまい事型を変換してくれる便利機能かと思ったら、全然違った。
Objectで表されているけど実は中身はInteger、とかそういう時に使う。
キャスト演算子。
import java.util.*; public class CastTest { public static void main(String[] args) { Object obj = 123; Integer i = Integer.class.cast(obj); } }
キャスト演算子との違い
やりたい事はキャスト演算子もClass.cast()も同じ。
何事もない時は、キャスト演算子と同じ。
でも、キャストに失敗した時の挙動が違う。
Class.cast()を使うと、キャスト出来なかった場合は、必ずClassCastExceptionが発生する。
キャスト演算子を使うと、キャスト出来なかった場合でも、キャスト後の型の変数に代入しない限りClassCastExceptionは発生してくれない。
だから、キャスト演算子は使わずにClass.cast()を使った方がよさそう。
import java.util.*; public class Favorites { private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>(); private Map<String, Object> values = new HashMap<String, Object>(); public static void main(String[] args) { Favorites f = new Favorites(); try { System.out.println(f.getFavoriteCast(Integer.class)); } catch (Exception e) { e.printStackTrace(); } System.out.println("----------"); try { System.out.println(f.getFavorite(Integer.class)); } catch (Exception e) { e.printStackTrace(); } System.out.println("----------"); try { System.out.println(f.getValue("integer", String.class)); } catch (Exception e) { e.printStackTrace(); } System.out.println("----------"); try { System.out.println(f.getValue("integer", Integer.class)); } catch (Exception e) { e.printStackTrace(); } } public Favorites() { favorites.put(Integer.class, "string"); values.put("integer", "string"); } // Class.cast public <T> T getFavoriteCast(Class<T> type) { return type.cast(favorites.get(type)); } // キャスト演算子 @SuppressWarnings("unchecked") public <T> T getFavorite(Class<T> type) { return (T)favorites.get(type); } public <T> T getValue(String key, Class<T> type){ Object value = values.get(key); if (value == null) { return type.cast(value); } assert(type.isAssignableFrom(value.getClass())): value.getClass().getSimpleName(); return type.cast(value); } }
実行結果
$ javac Favorites.java ; java -ea Favorites java.lang.ClassCastException at java.lang.Class.cast(Class.java:2990) at Favorites.getFavoriteCast(Favorites.java:42) at Favorites.main(Favorites.java:11) ---------- string ---------- string ---------- Exception in thread "main" java.lang.AssertionError: String at Favorites.getValue(Favorites.java:56) at Favorites.main(Favorites.java:29)
参考URL
★★Java質問・相談スレッド138★★ - レス抽出(5件)
http://unkar.org/r/tech/1272685619/96-97,109-111