这是重现异常所需的最最少的代码。
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; }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)