2011-01-20 75 views
4

我正在学习Java中的泛型。 我在编译过程中研究过,擦除会擦除所有的通用信息。擦除详细?

在这里,我研究了所有的T被替换为Object。

Integer v = display(2); 
String d = display("3"); 

public <T> T display(T i){ 
     return i; 
    } 

我希望它会变成

Integer v = (Integer)display(2); 
String d = (String) display("3"); 
public Object display(Object i){ 
return i; 
} 

所以,是我的假设吗?

感谢。

回答

4

你基本上拥有它。编译器使用泛型参数类型来验证代码,但生成的字节码替换为不同的类。

对于像<T>这样的未绑定的通用参数,它将是Object。但是,如果声明是<T extends Comparable>,则替换的类将是Comparable而不是Object

编辑:关于Java泛型伟大的信息,尽管确实密集,在部分信息:

Java泛型常见问题 - 常见问题
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+0

的联系是非常有用的感谢。 – Manoj 2011-01-24 13:05:01

0

基本上,是的。 Java中的泛型是一个很好的编译器技巧。

1

有关泛型类型的信息不会保存到编译类中,它仅在编译时用于检查类型安全性。

Integer v = display(2); 

的Java编译器知道这种方法是“通用”,并返回同一类型作为参数,在这种情况下,它是整数,并且结果被分配到整数,所以一切正常。

String d = display("3"); 

完全相同的把戏。但在这种情况下:

Long v = display(2); 

Java将告诉你,它不能投,因为2意思是整数,而Java不能将它转换为长,所以你需要写:

Long v = display(2L); 

正如我告诉,没有信息将在运行时间保存在编译的类,所以有可能你可以投入String类型的List<Integer>值,也没有会抛出异常,但是当你读这String,并试图给Integer类型变量你会得到它......好吧,相当棘手;)