Class.cast()について調べてみた

ジェネリクスと同じく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