我遇到了我完全无法理解的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!!!

10-01 12:22