我正在学习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;
}那么,我的假设是正确的吗?
谢谢。
发布于 2011-01-21 01:33:11
基本上你已经拥有它了。编译器使用泛型参数类型来验证代码,但生成的字节码替换在不同的类中。
对于像<T>这样的非绑定泛型参数,它应该是Object。但是,如果声明为<T extends Comparable>,则被替换的类将是Comparable而不是Object。
Java :关于泛型的很好的信息,尽管在各个部分中包含了大量的信息:
Java泛型常见问题-常见问题
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
发布于 2011-01-21 01:28:27
有关泛型类型的信息不会保存到已编译的类中,它只在编译时用于检查类型安全性。
Integer v = display(2);Java编译器知道该方法是“泛型”的,并且返回与其参数相同的类型,在本例中它是Integer,而result被赋值给Integer,所以一切都是正常的。
String d = display("3");完全一样的把戏。但在这种情况下:
Long v = display(2);Java会告诉您它不能强制转换,因为2意味着是Integer,而Java不能将其强制转换为Long,因此您需要编写:
Long v = display(2L);正如我所说的,没有任何信息被保存到编译的类中,所以在运行时你可能会把它放入String类型的List<Integer>值中,并且不会抛出异常,但是当你读取这个String并尝试将其赋值给Integer类型的变量时,你会得到它……嗯,相当棘手;)
发布于 2011-01-21 01:20:57
基本上是这样的。Java中的泛型是一个很好的编译器技巧。
https://stackoverflow.com/questions/4750285
复制相似问题