理解泛型的java问题
我编写了以下代码:
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;
}
}
我原以为我在演演员时会有例外,但我没有。我得到输出:“一”。但是,如果我做了new generic<Integer>
,type
成为整数类型的变量,那么如何将String
{T
,并将其存储在我的generic
类的变量type
中而不出现异常?解释一下就好了
# 1 楼答案
没有异常,因为type erasure会从代码中删除对} 接受
Integer
类型的任何检查。由于^{Object
,编译器不需要插入强制转换,代码只需擦除即可:请尝试以下分配:
在这种情况下,您将得到一个
ClassCastException
,因为代码将擦除为:请注意,切换类型的行为不同。这将抛出一个
ClassCastException
:这是因为使用了^{} 重载,因此代码将擦除为:
# 2 楼答案
在那里。给你修好了
# 3 楼答案
这是因为java类型擦除: http://docs.oracle.com/javase/tutorial/java/generics/erasure.html
基本上java将用Object替换T(如果T没有像您的示例中那样的边界上限类型),并且在运行时一切正常
# 4 楼答案
它不是将字符串强制转换为整数。。。。因为它是未绑定的。它将T转换为object,在sysout中,您将获得obj。而不是去串
正确的方法如下,您将在测试类中自动获得编译异常。。。正如所料