我遇到了我完全无法理解的Java泛型行为(以.NET为背景)。
public class TestGeneric<T>
{
public void get (Object arg)
{
T temp = (T) arg;
System.out.println(temp.toString());
return;
}
}
TestGeneric<Integer> tg = new TestGeneric<Integer>();
tg.get("Crack!!!");
请告诉我为什么我在get中没有得到ClassCastException,而且在Idea中,我在分配后将temp视为
String
并具有"Crack!!!"
的值。另外,我该如何抛出ClassCastException?我在Windows 7 x64上使用JDK 1.7.0_07。 最佳答案
没有得到类强制转换异常的原因是Java泛型是通过类型擦除实现的。与需要对CLS进行重大更改的.NET泛型不同,Java泛型完全在编译时处理。在运行时,将忽略对T
的强制转换。为了在运行时检查类型,您需要存储Class<T>
,并使用其方法检查传入的参数的类型:
public class TestGeneric<T>
{
private Class<T> genClass;
public TestGeneric(Class<T> t) {genClass = t;}
public void get (Object arg)
{
if (!genClass.isInstance(arg)) {
throw new ClassCastException();
}
T temp = (T) arg;
System.out.println(temp.toString());
return;
}
}
TestGeneric<Integer> tg = new TestGeneric<Integer>(Integer.class);
tg.get("Bang!!!"); // Now that's a real Bang!!!