2016-09-05 5 views
1

私は、一般的なクラスを持っているJavaのジェネリッククラスのオブジェクト配列のインスタンス化

public class GenericBookDet<K,V> 
{ 
    private K bkId; 
    private V bkDescription; 

    public GenericBookDet() 
    { 
    this.bkId = null; 
    this.bkDescription = null; 
    } 

    public GenericBookDet(K bkId, V bkDescription) 
    { 
     this.bkId = bkId; 
     this.bkDescription = bkDescription; 
    } 
    ... 
    //getter methods 
    //setter methods 
} 

私は別のクラスでは、このクラスの配列を作成し、新しいブックを追加したいです。

public class GenericBookStore<K,V> 
{ 
    static int noOfbooks = 0; 
    GenericBookDet<K,V>bk1[]; 

    public int addBook(K key, V bkDescription) 
    { 
     this.bk1[noOfbooks] = new GenericBookDet<K, V>(key,bkDescription); 
     this.bk1[noOfbooks].setbkDescription(bkDescription); 

     ++noOfbooks; 
     return noOfbooks; 
    } 
} 

私は、次のようにaddBookメソッドを呼び出しています:

GenericBookStore<String, String> bkStore = new GenericBookStore<String,String>(); 
bkStore.addBook("1010", "ABCD"); 

しかし、これはaddBook方法の最初の行にNullPointerExceptionがスローされます。

bkDescriptionフィールドにStringまたはObjectを渡すことができる汎用ブック配列をGenericBookStoreに作成したいと思います。あなたはあなたがパラメータ化された型の配列を作成することはできませんGenericBookDet<K,V>bk1[]

GenericBookDet<K,V>bk1[] = new GenericBookDet[10] 

を初期化していなかったので

答えて

6

NPEが発生します。 @SuppressWarnings("unchecked")を追加すると、警告が表示されなくなります。

noOfbooksstaticであってはなりません。 10個以上の要素がある場合、配列のサイズを変更する必要があります。新しい配列を作成し、配列内のすべてを移動します。

List<GenericBookDet<K,V>>を使用することをお勧めします。

+3

警告メッセージが表示されます。私はジェネリックアレイを作成する良い方法がないと思う。リストを使用することを検討してください(特にあなたがそれを成長させたいと思われるので)。 – Thilo

3

Thou shalt notジェネリック型の配列を作成します。なぜそれがoracleを参照してください。それにもかかわらず、人がそれをするときに何が起こる可能性があります。

正しい答えは、代わりにList<GenericBookDet<K,V>>を使用します。ここでは配列の使用を忘れてしまいます。以下のような

public class GenericBookStore<K,V> 
{ 
    private final List<GenericBookDet<K,V>> descriptions = new ArrayList<>; 

    public int addBook(K key, V bkDescription) { 
    descriptions.add(new GenericBookDet<>(key,bkDescription))); 
    return descriptions.size(); 
    } 

特に、あなたのコードは、新しい本を追加動的であるとして、アレイは固定のサイズを持っています。あなたが動的に成長することを可能にするList/ArrayListを単に使うもう一つの理由!

genericアレイを絶対に使用したい場合は、hereもよくお読みください。

関連する問題