3

私は一連のデータ構造を実装しており、配列を介して maxheap の実装を試みることにしました。これは、maxheap の一般的な実装の 1 つであるためです。そのために、型と次のクラス シグネチャMaxHeap<T>を受け入れるインターフェイスを呼び出します。ComparableT

 public class ArrayMaxHeap<T extends Comparable<T>> implements MaxHeap<T> {

TそうしComparableないと、ヒープへの追加やヒープからの削除を行うときに、要素を互いに比較することができなくなります。問題は、クラスのコンストラクターにあります。

public class ArrayMaxHeap<T extends Comparable<T>> implements MaxHeap<T> {

    private T[] data;
    private int last;
    private static final int INIT_CAPACITY = 10;

    /**
     * Creates an empty ArrayMaxHeap with the default capacity.
     */
    public ArrayMaxHeap(){
        data = (T[])(new Object[INIT_CAPACITY]);
        last = 0;
    }

の型キャストはdataをスローしています。これは、 ではないClassCastExceptionからのダウンキャストが安全でないためです。私はこれで壁にぶつかり、コンストラクターの実装方法がわかりません。どんな助けでも大歓迎です。ObjectComparable

4

2 に答える 2

2

これは、ジェネリックの一種の制限です。代わりに、配列を次のように宣言し、Object[]返そうとする要素をキャストします。何に似た何かArrayList

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

E elementData(int index) {
    return (E) elementData[index];
}

どこelementDataですか

private transient Object[] elementData;

入ってくるものをコントロールすれば問題ありません。

Rohit さんのコメントが素晴らしいので、質問と回答をリンクします。

于 2013-10-09T21:00:50.687 に答える
0

に変更するだけです

data = (T[])new Comparable[INIT_CAPACITY];
于 2013-10-10T01:32:56.220 に答える