我遇到了一个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
克里斯
答案 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