我写了以下代码:
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;
}
}
而且我认为在演员表中我会得到一个例外,但我没有。我得到输出:&#34;一个&#34;。但是,如果我new generic<Integer>
,type
成为Integer类型的变量,那么我如何将String
"one"
转换为T
并将其存储在变量中我的type
课程中generic
没有例外?解释会很棒。
答案 0 :(得分:4)
没有例外,因为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);
答案 1 :(得分:1)
这是因为java类型擦除: http://docs.oracle.com/javase/tutorial/java/generics/erasure.html
基本上java会用对象替换T(如果T没有像你的例子那样没有边界上层类型) - 并且在运行时一切都很好。
答案 2 :(得分:0)
它不会将您的字符串转换为整数....因为它是未绑定的。它将T转换为对象,而在sysout中,您将获得obj.toString。
正确的方法如下所示,您将在测试类中自动获得编译异常......正如预期的那样。
class Generic<T>
{
public T type;
public Generic(T t)
{
type = t;
}
}
答案 3 :(得分:-1)
class Generic<T>
{
public T type;
public Generic(T obj)
{
type = obj;
}
}
有。为你修好了。