【问题标题】:Exception thrown when using generic arrays使用泛型数组时抛出异常
【发布时间】:2014-02-21 13:17:49
【问题描述】:

在以下情况下,我遇到了一个我不理解的 ArrayStoreException:

文件 List.java:

import java.lang.reflect.Array;
class List<K> {
    K[] _list;
    K _dummy;
    int _size, _index;

    public List(int size) {
        _size = size;
        _index = 0;
        Class<?> cls = getClass();

        // as following is not allowed
        // _list = new K[size]; -->  cannot create a generic array of K
        // I'm doing the following instead
        _list = (K[])Array.newInstance(cls,size);
    }

    public void add(K obj) {
        _list[_index++] = obj;  // HERE'S THE EXCEPTION
                        //      java.lang.ArrayStoreException ??

        // IF I ASSIGN _dummy INSTEAD
        _list[_index++] = _dummy;   // NO ERROR
    }
} // class List

文件 mainLists.java:

public class mainLists {    
    public static void main(String[] args) {        
        List<String> list = new List<String>(5);
        list.add("test");
    }
}

文档对 ArrayStoreException 的评价: "抛出表示试图将错误类型的对象存储到对象数组中"

但我将字符串类型“test”传递给方法 add() 不是吗?

这里有什么问题?

谢谢

克里斯

【问题讨论】:

    标签: java arrays generics


    【解决方案1】:

    你的数组是一个 List 数组,而不是一个 K 数组,因为你用

    Array.newInstance(cls,size);
    

    cls 的初始化位置

    Class<?> cls = getClass();
    

    返回当前对象类,即this的类。

    您可以简单地使用Object[]

    【讨论】:

      【解决方案2】:

      Class&lt;?&gt; cls = getClass(); 将使用当前实例 (this) 来获取 Class 对象,因此稍后您将创建不接受 StringsLists 数组。

      也许不是猜测要创建什么类型的数组,而是让用户在List 构造函数中传递Class,这将与指定的K 类型相同。

      public List(int size, Class<K> clazz)
      

      【讨论】:

        猜你喜欢
        • 2012-09-20
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        相关资源
        最近更新 更多