我有一个标题为public class MaxPQ<Key extends Comparable<Key>>
的标题的类。现在,当我尝试创建一个Key数组时,我在构造函数中的方式如下:Key[] pq = (Key[]) new Comparable[2];
这工作正常,但如果我将Comparable更改为Object,我会收到错误。为什么呢?
在标题看起来像public class Stack<Item>
的另一个代码中,制作像Item[] stack = (Item[]) new Object[1]
这样的Item数组工作得很好。
PS:我正在关注在线教程,这就是代码的样子:
public class MaxPQ<Key extends Comparable<Key>> {
private Key[] pq;
private int N;
public MaxPQ(int capacity) {
pq = (Key[]) new Comparable[capacity + 1];
}
public void insert(Key key) {
pq[++N] = key;
swim(N);
}
public Key delMax() {
Key key = pq[1];
exch(1, N--);
sink(1);
pq[N + 1] = null;
return key;
}
private void swim(int k) {
while(k > 1 && less(k/2, k)) {
exch(k, k/2);
k = k/2;
}
}
private void sink(int k) {
while (2*k < N) {
int j = 2*k;
if (j < N && less(j, j + 1)) j++;
if (less(j, k)) break;
exch(j, k);
k = j;
}
}
private boolean less(int p, int q) {
return pq[p].compareTo(pq[q]) < 0;
}
private void exch(int p, int q) {
Key temp = pq[p];
pq[p] = pq[q];
pq[q] = temp;
}
答案 0 :(得分:3)
当泛型类型具有上限时,擦除类型是上限。这意味着像
这样的类public class Stack<I> {
private I[] array;
}
实际上编译为类似
的东西public class Stack {
private Object[] array;
}
而像
这样的课程public class MaxPQ<Key extends Comparable<Key>> {
private Key[] array;
}
编译为类似
的内容public class MaxPQ {
private Comparable[] array;
}
因此,执行时
Key[] pq = (Key[]) new Comparable[2];
实际执行的是
Comparable[] pq = (Comparable[]) new Comparable[2];
哪个好。如果将其更改为Object [],则实际上正在执行
Comparable[] pq = (Comparable[]) new Object[2];
导致ClassCastException,因为Object[]
不是Comparable[]
。
你应该使用List<Key>
代替数组:你不会遇到所有这些麻烦。