2017-02-25 6 views
0

ジェネリックの使用中に配列を宣言して割り当てようとしていますが、これに少し問題があります。私は通常、ジェネリックを使って配列を割り当てることは不可能であることに気付きました。私はこの回避策を見つけましたが、それは私にとってはうまくいかないようです。 Array.newInstance(c、capacity)に到達すると、NullPointerExceptionを出力します。私は、このコードが配列を宣言することを期待しています。なぜこれが期待されているように機能しないのでしょうか?あなたの根本的な問題の対処ジェネリックでの配列の宣言と割り当て

public class MyHeap<T extends Comparable<T>> implements Heap<T> { 
Class<T> type; 
T[] heap; 
int size; 
int capacity; 


MyHeap(int x){ 
    capacity = x; 
    size = 0; 
    arraySet(type, capacity); 
} 

private void arraySet(Class<T> c, int capacity){ 
    @SuppressWarnings("unchecked") 
    final T[] heap = (T[]) Array.newInstance(c, capacity); 
    this.heap = heap; 
} 

}

+0

'type'が' null'なので'List'を使うことができます。コンポーネントタイプへの参照は必要ありません。 –

+0

ああ!私はそれを認識しませんでした。しかし、私はそれをどのように設定するのですか?残念ながら私は配列でなければなりません。私は私のデータ構造とアルゴリズムクラスのラボの一部としてこれをやっていて、配列を使うにはこの実装が必要です – Deezer

+1

なぜなら 'Comparable []'を使わないのはなぜですか?あなたはすでにそれがコンポーネント型であることを知っています: 'Comparable'。 –

答えて

0

を...しかし、私は、クラスが何であるかを理解していませんか?どのように値を設定するのですか?

あなたのオプションは以下のとおりです。あなたのコンストラクタにパラメータとして

  1. パスを:

    MyHeap (int x, Class<T> type) { this.type = type; ... } 
    
    // Usage 
    new MyHeap(64, Integer.class); 
    
  2. 峠コンストラクタにそのタイプの何か(お使いの場合には適切ではない)と、そのタイプ情報を使用してください:

    MyHeap (int x, T obj) { this.type = obj.getClass(); ... } 
    
    // Usage 
    new MyHeap(64, new Integer()); 
    

    List#toArray(T[])は、この目的のためにこのパターンを使用します。

  3. Objectアレイを内部で保存すると(Object[] heap)、アレイの作成時にそのタイプを使用する必要はありません。 ArrayList is implemented this way、関数パラメータリストにTを使用している限り、コンパイラはすべてがクールであることを確認します。 Tの戻り値の型の場合は、オブジェクトを返す前にTにキャストする必要がありますが(example)、それらのすべてがTである不変量を持つ限り、常に安全なキャストになります。

これは、最も単純なAPIにつながるので、オプション3を使用します。

関連する問題