我写了以下代码:
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/