从java中的参数创建数组

时间:2011-06-30 10:37:50

标签: java generics arraylist

我已经使用数组实现了数组列表:

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

代码出了什么问题?

2 个答案:

答案 0 :(得分:4)

无法在运行时检查强制转换,因此会发出警告。同 如果是最新的编译器,您可以使用@SuppressWarnings("unchecked")来禁止警告。

有用吗?

http://mindprod.com/jgloss/compileerrormessages.html#TYPESAFETYERASED

答案 1 :(得分:1)

当你从Object[]转换为E[]时,你实际上是在说谎,因为数组在运行时保持它们的组件类型,因此实际上不可能从Object[]转换为E[]更具体的数组类型;但由于您在类型参数E的范围内,Object[]将被删除,因此不会导致错误。

这实际上是你能做的最好的,因为唯一的另一种选择是让变量“A”属于E类型,但是每次你必须投入ArrayList从中获取一些东西,这会产生更多未经检查的投射警告。你无法摆脱它,所以你只需要压制它们。 (除非你包装了一个预制的类型,它类似于你的类{{1}},它本身做同样的事情并且必须在内部抑制这些警告)