Java通用类对象数组实例化

时间:2016-09-05 07:25:12

标签: java generics

我有一个通用类

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。

我想在GenericBookStore中创建一个通用的书籍数组,我可以在bkDescription字段中传递String或对象;

2 个答案:

答案 0 :(得分:6)

NPE的发生是因为您没有初始化GenericBookDet<K,V>bk1[]

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

您无法创建参数化类型的数组。您可以添加@SuppressWarnings("unchecked"),这样就不会收到任何警告。

同样noOfbooks不应该是static。如果您有超过10个元素,则必须调整数组的大小:创建一个新元素并移动其中的所有内容。

最好的选择是使用List<GenericBookDet<K,V>>

答案 1 :(得分:3)

你不能创建泛型类型的数组;见oracle为什么会这样;当一个人做到这一点时会发生什么。

正确答案是使用<div class="one" onmouseover="mouseOver(this)"></div>代替;并且忘了在这里首先使用数组;像

List<GenericBookDet<K,V>>

特别是,您的代码动态添加新书;而数组的大小固定。另一个简单使用List / ArrayList的原因是允许你动态增长!

如果一个人绝对想要使用通用数组,那么最好也阅读这个here