我想将ArrayList
类重写为自定义类。
我尝试这样做而不使用任何java内置函数,只使用java的基本功能。
我为MyArrayList.toArray
方法编写了这部分代码:
public Object[] toArray() {
E[] array = (E[]) new Object[size];
for (int i = 0; i < size; ++i) {
array[i] = data[i];
}
return array;
}
但正如您所知,它会引发ArrayStoreException
。
然后我看了一下ArrayList类的 OpenJDK6 实现,并且使用了Arrays.copyOf();
和System.arraycopy();
这不是我想要的。
任何人都可以帮我写这个方法,只使用java原生功能吗?
答案 0 :(得分:2)
你无法绕过vanilla Java中的ArrayStoreException
,因为那是为了防止程序员将某些内容放入一个无法放入数组的数组中。
Recall from the JLS在运行时检查并强制执行此操作。从generic types aren't reifiable开始,JVM明确禁止创建数组。
如果所分配的值的类型与组件类型不是赋值兼容(第5.2节),则抛出
ArrayStoreException
。如果数组的组件类型不可恢复(第4.7节),则Java虚拟机无法执行前一段中描述的存储检查。这就是为什么禁止使用具有不可恢复元素类型的数组创建表达式(第15.10节)。可以声明一个数组类型的变量,其元素类型是不可恢复的,但是将数组创建表达式的结果赋值给变量必然会导致未经检查的警告(第5.1.9节)。
System#arraycopy
通过作弊来解决这个问题。
这是一个 native 方法,这意味着纯Java中没有实现;它用C语写成。
如果数组的基本组件不匹配,或者您正在混合基本组件数组和引用组件数组,它只会抛出ArrayStoreException
。