2016-09-05 3 views
1

У меня есть универсальный классJava Generic объект класса массив конкретизация

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"); 

Но это бросает NullPointerException в первой строке метода addBook.

Я хочу создать общий массив книг в GenericBookStore, в который я могу передать String и/или объект в поле bkDescription;

ответ

6

NPE происходит потому, что вы не инициализировать GenericBookDet<K,V>bk1[]

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

Вы не можете создавать массивы параметризованных типов. Вы можете добавить @SuppressWarnings("unchecked"), чтобы вы не получили никаких предупреждений.

Также noOfbooks не должно быть static. Если у вас более 10 элементов, вам нужно изменить размер массива: создать новый и переместить все в нем.

Лучшим вариантом является использование List<GenericBookDet<K,V>>.

+3

Обратите внимание, что вы получите предупреждения типа. Я думаю, что нет хорошего способа создать общий массив. Подумайте о том, чтобы использовать Список (особенно, поскольку вы, похоже, хотите его вырастить). – Thilo

3

Не должно быть создавать массивы общих типов; см. 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, который позволяет динамически расти!

Если кто-то абсолютно хочет использовать общие массивы, лучше прочитайте это here.

Смежные вопросы