关于Java泛型的类型参数的强制转换?
以下是ArrayList<E>
类中一段源码,众所周知此类是泛型类,但是会出现泛型擦除,问题就是return (E) elementData[index]
中这个(E)
岂不是无用了?
transient Object[] elementData; // non-private to simplify nested class access
// Positional Access Operations
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
有用的,因为前面
elementData
声明为Object[]
了。new arraylist的时候 传入 E的具体类型
E是你add的时候传入的 元素类型是E, 数据是存入到 transient Object[] elementData 里面
不强转 的话 类型不匹配会报编译错误。
泛型就是语法糖,用于编译阶段的,如果类型不匹配编译错误,帮助开发者更容易发现问题,跟运行时没什么关系。
没有强转
(E)
,编译不通过啊。elementData
是Object
类型,而返回值是E
类型。编译通过后是不需要了。