Javaj是伪泛型, 为什么可以做到消除强制类型转化

bugunao1 2014-05-08 05:29:28
我知道Java会在编译后把所有的泛型信息都擦除掉,是伪泛型。下面给出的是ArrayList<E>的get方法实现:

public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}

我的理解是, 泛型信息擦除后变成了:

public Object get(int index) {
RangeCheck(index);
return (Object) elementData[index];
}

所以

ArrayList<String> list = new ArrayList<String>();
list.add("abcde");
Object obj = list.get(0); // 这里应该返回是Object, 但实际返回是String


请问它是如何做到类型转化的呢?这点我想不通,谢谢。。
...全文
202 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugunao1 2014-05-09
  • 打赏
  • 举报
回复
搞技术不能说好像呀,呵呵。
alan19931103 2014-05-08
  • 打赏
  • 举报
回复
引用 2 楼 bugunao1 的回复:
@kk_124 谢谢回答, 好像你是对的, 下面是我反编译的字节码, 我红圈的部分是有作转型的动作.
不是好像,2楼就是对的。 java把泛型擦掉之后运行,返回的时候再加上
bugunao1 2014-05-08
  • 打赏
  • 举报
回复
@kk_124
谢谢回答, 好像你是对的, 下面是我反编译的字节码, 我红圈的部分是有作转型的动作.
普凡 2014-05-08
  • 打赏
  • 举报
回复
正如楼主所说 java是伪泛型,他是在编译的时候 javac就把类型擦除掉,并且加上强制转换,所以上边的代码 ArrayList<String> list = new ArrayList<String>(); list.add("abcde"); Object obj = list.get(0); 在编译之后会变成: ArrayList list = new ArrayList(); list.add("abcde"); String obj =(String) list.get(0);

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧