在Java中键入cast作为缺少泛型数组的变通方法

时间:2015-07-26 14:42:06

标签: java generics casting

我有一个标题为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;
}

1 个答案:

答案 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>代替数组:你不会遇到所有这些麻烦。