Ljava.lang.Object; 无法转换为[Ljava.lang.Integer

Ljava.lang.Object; 无法转换为[Ljava.lang.Integer,第1张

Ljava.lang.Object; 无法转换为[Ljava.lang.Integer

这是重现异常所需的最最少的代码

class Stack<E> {    protected E[] elements = (E[])new Object[1];}class IntStack extends Stack<Integer> {    void push(Integer i) {        // subtly accessing elements as Integer[] which it's not        elements[0] = i;    }}

Java泛型使用类型擦除来实现,因此在编译后,此代码将转换为以下内容:

class Stack {    protected Object[] elements = new Object[1];}class IntStack extends Stack {    void push(Integer i) {        // throws ClassCastException        ((Integer[])elements)[0] = i;    }}

显然,a

new Object[]
不是
Integer[]
。请注意演员表如何移动到您未明确放置的位置。这就是为什么
(E[])newObject[size]
是一个 未经检查的铸造 和显示警告信息。

相反,

Object[]
只有在需要将元素返回到外部世界时,才应使用并执行未经检查的强制转换。

class Stack<E> {    private Object[] elements;    private int size;    Stack(int len) {        elements = new Object[len];    }    void push(E e) {        elements[size] = e;        size++;    }    E pop() {       @SuppressWarnings("unchecked");       E e = (E)elements[size - 1];       size--;       return e;    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5439469.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存