【问题标题】:create array from parameter in java从java中的参数创建数组
【发布时间】:2011-06-30 10:37:50
【问题描述】:

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

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

代码有什么问题?

【问题讨论】:

    标签: java generics arraylist


    【解决方案1】:

    无法在运行时检查强制转换,因此会给出警告。和 一个最新的编译器,你可以使用@SuppressWarnings("unchecked")来抑制警告。

    有帮助吗?

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

    【讨论】:

    • 有什么办法可以彻底解决问题,而不是一味的忽略?
    【解决方案2】:

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

    这实际上是你能做的最好的,因为唯一的其他选择是让变量“A”的类型为Object[],但是每次你得到一些东西时你都必须转换为E它,这将产生更多未经检查的强制转换警告。你无法摆脱它,所以你只能压制它们。 (除非你包装了一个预制类型,它可以像 ArrayList 那样做你的类所做的事情,它本身做同样的事情并且必须在内部抑制这些警告)

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多