당신의 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;
}
}
을있을 것
class MyReader<T> {
private final Class<T> clazz;
MyReader(Class<T> clazz) {
if (clazz == null) {
throw new NullPointerException();
}
this.clazz = clazz;
}
public T restore(String from) {
...
try {
restoredItem = clazz.cast(decoder.readObject());
...
return restoredItem;
} catch (ClassCastException exc) {
...
}
}
}
또는 일반적인 방법으로
cast 및 castBaseNumber에 대한 처음 5 개의 호출에는 ClassCastException이 없습니다. 컴파일러가 cast()를 return (Object) o로, castBaseNumber()를 return (Number) o로 효과적으로 변환하기 때문에 6 번째 호출 만 ClassCastException을 throw합니다. 당신이 쓴다
String s = GenericsTest.<Long> cast("Hallo");
당신은 ClassCastException을 얻을 수는 있지만 캐스트 방법은 없지만 s에 할당 할 때.
따라서 "T"는 "T"가 아니라 "T extends Something"이라고 생각합니다. 따라서 다음을 확인할 수 있습니다 :
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
이 경우에는 Tom의 조언 만 도움이 될 수 있습니다. 당신이 instaceof 사용할 수없는 경우
다시 태그에 일지 어떨지 방법을 사용할 수 있습니다. –