Java 详细的擦除?
我正在学习Java中的泛型。 我研究过,在编译过程中,擦除会擦除所有的通用信息 在这里,我研究了所有的T都被Object替换Java 详细的擦除?,java,generics,Java,Generics,我正在学习Java中的泛型。 我研究过,在编译过程中,擦除会擦除所有的通用信息 在这里,我研究了所有的T都被Object替换 Integer v = display(2); String d = display("3"); public <T> T display(T i){ return i; } 那么,我的假设正确吗 谢谢。基本上是的。Java中的泛型是一个很好的编译器技巧 有关泛型类型的信息不会保存到编译类中,它仅在编译时用于检查类型安全性 Int
Integer v = display(2);
String d = display("3");
public <T> T display(T i){
return i;
}
那么,我的假设正确吗
谢谢。基本上是的。Java中的泛型是一个很好的编译器技巧 有关泛型类型的信息不会保存到编译类中,它仅在编译时用于检查类型安全性
Integer v = display(2);
Java编译器知道该方法是“泛型”的,它返回的类型与它的参数相同,在本例中是Integer,结果被分配给Integer,所以一切都正常
String d = display("3");
完全一样的把戏。但在这种情况下:
Long v = display(2);
Java会告诉您它不能强制转换,因为2意味着是整数,Java不能将其强制转换为长,所以您需要编写:
Long v = display(2L);
正如我所说的,没有任何信息保存到编译类中,因此在运行时,您可能会将其放入
String
类型的列表
值中,并且不会引发异常,但是当您阅读此String
并尝试分配给Integer
类型变量时,您将得到它。。。嗯,相当棘手;) 基本上你已经拥有了。编译器使用泛型参数类型来验证代码,但生成的字节码替换在不同的类中
对于未绑定的泛型参数,如
,它将是对象
。但是,如果声明是
,则被替换的类将是可比较的
,而不是对象
编辑:关于Java泛型的大量信息,尽管其中的部分信息非常密集:
Java泛型常见问题解答-常见问题Long v = display(2L);