【问题标题】:Java Generic class object array instantiation [duplicate]Java通用类对象数组实例化[重复]
【发布时间】:2016-09-05 15:52:08
【问题描述】:

我有一个通用类

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 中创建一个通用书籍数组,我可以将 String 或 bkDescription 字段中的对象传递给该数组;

【问题讨论】:

    标签: java generics


    【解决方案1】:

    NPE 发生是因为您没有初始化 GenericBookDet&lt;K,V&gt;bk1[]

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

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

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

    最好的选择是使用List&lt;GenericBookDet&lt;K,V&gt;&gt;

    【讨论】:

    • 请注意,您会收到类型警告。我认为没有创建通用数组的好方法。考虑使用列表(特别是因为您似乎想要扩展它)。
    【解决方案2】:

    您不应创建泛型类型的数组;请参阅oracle 为什么会这样;以及当一个人这样做时会发生什么。

    正确的答案是改用List&lt;GenericBookDet&lt;K,V&gt;&gt;;并且首先忘记在这里使用数组;喜欢

    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

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 2018-01-02
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2015-07-11
      相关资源
      最近更新 更多