首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >详细的擦除?

详细的擦除?
EN

Stack Overflow用户
提问于 2011-01-21 01:14:00
回答 3查看 132关注 0票数 4

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

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

代码语言:javascript
运行
复制
 Integer v = display(2);
 String d = display("3");

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

我希望它能变成

代码语言:javascript
运行
复制
Integer v = (Integer)display(2);
String d = (String) display("3");
public Object display(Object i){
return i;
}

那么,我的假设是正确的吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-21 01:33:11

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

对于像<T>这样的非绑定泛型参数,它应该是Object。但是,如果声明为<T extends Comparable>,则被替换的类将是Comparable而不是Object

Java :关于泛型的很好的信息,尽管在各个部分中包含了大量的信息:

Java泛型常见问题-常见问题

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

票数 4
EN

Stack Overflow用户

发布于 2011-01-21 01:28:27

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

代码语言:javascript
运行
复制
Integer v = display(2);

Java编译器知道该方法是“泛型”的,并且返回与其参数相同的类型,在本例中它是Integer,而result被赋值给Integer,所以一切都是正常的。

代码语言:javascript
运行
复制
String d = display("3");

完全一样的把戏。但在这种情况下:

代码语言:javascript
运行
复制
Long v = display(2);

Java会告诉您它不能强制转换,因为2意味着是Integer,而Java不能将其强制转换为Long,因此您需要编写:

代码语言:javascript
运行
复制
Long v = display(2L);

正如我所说的,没有任何信息被保存到编译的类中,所以在运行时你可能会把它放入String类型的List<Integer>值中,并且不会抛出异常,但是当你读取这个String并尝试将其赋值给Integer类型的变量时,你会得到它……嗯,相当棘手;)

票数 1
EN

Stack Overflow用户

发布于 2011-01-21 01:20:57

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4750285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档