我已经使用数组实现了数组列表:
public class ArrayIndexList<E> {
private E[] A;
private int capacity = 5; // Initial Array Size
private int size = 0;
public ArrayIndexList() {
A = (E[]) new Object[capacity];
}
public void add(int index, E element) {
/* if array is full:
* 1. double the array size
* 2. copy elements to the new array */
if (size == capacity) {
capacity = capacity * 2;
E[] B = (E[]) new Object[capacity];
for (int i = 0;i < size;i++)
B[i] = A[i];
A = B;
}
// shift the elements up
for (int i = size - 1;i >= index;i--)
A[i + 1] = A[i];
// add new element
A[index] = element;
size = size + 1;
}
public E remove(int index) {
E temp = A[index];
//shift elements down
for (int i = index;i < size - 1;i++)
A[i] = A[i + 1];
size = size - 1;
return temp;
}
}
它正在工作,但编译器发出警告:
Type safety: Unchecked cast from Object[] to E[] ArrayIndexList.java
代码出了什么问题?
答案 0 :(得分:4)
无法在运行时检查强制转换,因此会发出警告。同
如果是最新的编译器,您可以使用@SuppressWarnings("unchecked")
来禁止警告。
有用吗?
http://mindprod.com/jgloss/compileerrormessages.html#TYPESAFETYERASED
答案 1 :(得分:1)
当你从Object[]
转换为E[]
时,你实际上是在说谎,因为数组在运行时保持它们的组件类型,因此实际上不可能从Object[]
转换为E[]
更具体的数组类型;但由于您在类型参数E的范围内,Object[]
将被删除,因此不会导致错误。
这实际上是你能做的最好的,因为唯一的另一种选择是让变量“A”属于E
类型,但是每次你必须投入ArrayList
从中获取一些东西,这会产生更多未经检查的投射警告。你无法摆脱它,所以你只需要压制它们。 (除非你包装了一个预制的类型,它类似于你的类{{1}},它本身做同样的事情并且必须在内部抑制这些警告)