我写了以下代码:

public class Test
{
    public static void main(String args[]) throws ParseException
    {
        System.out.println(new Generic<Integer>("one").type);  //outputs "one"
    }
}

class Generic<T>
{
    public T type;

    public Generic(Object obj)
    {
        type = (T)obj;
    }
}

我以为我在做 Actor 时会得到一个异常(exception),但我没有。我得到输出:“一个”。但是,如果我执行 new generic<Integer>type 将成为 Integer 类型的变量,那么我如何将 String "one" 转换为 T 并将其存储在 type 类中的变量 generic 中而不会出现异常?一个解释会很棒。

最佳答案

也不异常(exception),因为 type erasure 从您的代码中删除了对 Integer 类型的任何检查。由于 println 接受 Object,编译器不需要插入强制转换,代码简单地删除为:

System.out.println(new Generic("one").type);

请尝试以下分配:
Integer i = new Generic<Integer>("one").type;

在这种情况下,您将获得 ClassCastException,因为代码删除为:
Integer i = (Integer)new Generic("one").type;

请注意,切换类型的行为不同。这将抛出一个 ClassCastException :
System.out.println(new Generic<String>(123).type);

那是因为使用了 println(String) 重载,所以代码删除为:
System.out.println((String)new Generic(123).type);

关于java - 理解泛型的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22355432/

10-12 23:55