Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 详细的擦除?_Java_Generics - Fatal编程技术网

Java 详细的擦除?

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

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

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

 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);