Tにベースがある場合を除いて、ClassCastExceptionは発生しません。
public class GenericsTest
{
public static void main(String[] args)
{
System.out.println(cast(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> cast(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> cast("Hallo"));
System.out.println(castBaseNumber(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> castBaseNumber(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> castBaseNumber("Hallo"));
}
private static <T extends Number> T castBaseNumber(Object o)
{
T t = (T)o;
return t;
}
private static <T> T cast(Object o)
{
T t = (T)o;
return t;
}
}
上記の例では、castとcastBaseNumberへの最初の5回の呼び出しでClassCastExceptionは発生しません。コンパイラはcast()を効果的に変換して(Object)oを返し、castBaseNumber()を(Number)o;に返すため、6番目の呼び出しのみがClassCastExceptionをスローします。あなたが書くウェン
String s = GenericsTest.<Long> cast("Hallo");
ClassCastExceptionが発生しますが、castメソッドでは発生しませんが、sへの割り当て時に発生します。
したがって、あなたの「T」は「T」だけでなく、「Tは何かを拡張する」と思います。だからあなたはチェックすることができます:
Object o = decoder.readObject();
if (o instanceof Something)
restoredItem = (T) o;
else
// Error handling
ただし、後でクラスを使用すると、エラーが発生します。
public Reader<T extends Number>{...}
Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
この場合、トムのアドバイスだけが役立つかもしれません。