ArrayList错误,未经检查和不安全的操作

时间:2015-12-01 21:28:43

标签: java arraylist

此代码不会为我编译,任何人都可以修复它或看到它的问题? 我一直收到错误arraylistv2.java uses unchecked or unsafe operators, 当我添加-Xlint时,它指向

private T[] seq = (T[])(new Object[1024]); // 1024 arbitrary

作为问题,有什么想法吗?

    class ArrayList<T>
      {
        private T[] seq = (T[])(new Object[1024]); // 1024 arbitrary
        private int numItems = 0; // seq[0..numItems-1] significant

        public int size() { return(numItems); }

        public T get(int i)
        {
        if(i < 0 || i >= numItems)
            throw new IndexOutOfBoundsException();
        else
            return seq[i];
        }

        public T set(int i, T t)
        {
            if(i < 0 || i >= numItems)
                throw new IndexOutOfBoundsException();
            else
            {
                T temp = seq[i];
                seq[i] = t;
                return temp;
            }
        }

        public boolean add(T t)
        {
            add(numItems,t);
            return true; // for compatibility reasons only
        }

        public void add(int i, T t)
        {
        if(i < 0 || i > numItems)
            throw new IndexOutOfBoundsException();
        if(numItems == seq.length)
            resize(); // extend seq
        for(int k = numItems; k > i; k--) // shift seq[i..] to right
            seq[k] = seq[k-1];
        seq[i] = t;
        numItems++;
    }

    private void resize()
    { // seq is full -- double its size
    T[] temp = (T[])(new Object[seq.length * 2]); // bigger array
    for (int i = 0; i < seq.length; i++) // copy over items
        temp[i] = seq[i];
    seq = temp; 
    }
}

public class arraylistv2{
    public static void main(String [] args){

        ArrayList<String> arraylist1 = new ArrayList<String>();
        arraylist1.add(1,"orange");
        arraylist1.add(2,"apple");

        int i = arraylist1.size();
        System.out.println(arraylist1);

    }


}

1 个答案:

答案 0 :(得分:0)

消息"arraylistv2.java uses unchecked or unsafe operators"是警告而不是错误。换句话说,代码中没有编译时错误。因此,它应该编译得很好(虽然有一些警告信息)。

您的代码中确实存在运行时错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException
  at arraylistv2$ArrayList.add(arraylistv2.java:45)
  at arraylistv2.main(arraylistv2.java:5)

最后,您的代码中似乎不需要从object[]T[]的类型转换:

private T[] seq = (T[])(new Object[1024]);

我建议将其保留为Object[]。自定义ArrayList类的所有方法都使用泛型类型T,因此无论如何都无法在seq中放置任何其他类型的对象。这是我前一段时间写的自定义ArrayList类的示例:https://github.com/anshulverma/nuaavee-collections/blob/master/src/main/java/com/nuaavee/collections/list/ArrayList.java

希望有所帮助。

P.S。我还应该指出,通常更好地提出具体问题而不是粘贴完整的代码清单。您将有更多人以这种方式回答您的问题。不像每个人都有很多空闲时间;)