使用通用数组时抛出异常

时间:2014-02-21 13:17:50

标签: java arrays generics

我遇到了一个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的说法: “抛出表示已尝试将错误类型的对象存储到对象数组中”

但是我将String类型“test”传递给方法add()no?

这里有什么问题?

THX

克里斯

2 个答案:

答案 0 :(得分:4)

您的数组是List的数组,而不是K的数组,因为您使用

实例化它
Array.newInstance(cls,size);

其中cls初始化为

Class<?> cls = getClass();

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

您只需使用Object[]

答案 1 :(得分:2)

Class<?> cls = getClass();将使用当前实例(this)来获取Class对象,因此稍后您将创建不接受List的{​​{1}}数组。

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

K