создать массив из параметра в Java - PullRequest
0 голосов
/ 30 июня 2011

Я реализовал список массивов с массивами:

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 ]

4 голосов
/ 30 июня 2011

Приведение не может быть проверено во время выполнения, поэтому выдается предупреждение. С современный компилятор, вы можете подавить предупреждение, используя @SuppressWarnings("unchecked").

было ли это полезно?

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

1 голос
/ 01 июля 2011

Вы на самом деле врете, когда вы приводите от Object[] до E[], потому что массивы хранят свой тип компонента во время выполнения, поэтому в действительности невозможно преобразовать из Object[] в более конкретный тип массива;но поскольку вы находитесь в области видимости параметра типа E, E[] стирается, чтобы не вызывать ошибку.

На самом деле это лучшее, что вы можете сделать, потому что единственная альтернатива - иметь переменную ""Be" типа Object[], но тогда вам придется приводить в E каждый раз, когда вы получаете что-то из этого, что будет генерировать еще больше непроверенных предупреждений о приведении.Вы никак не можете выбраться из этого, поэтому вам просто нужно их подавить.(если вы не заключаете в оболочку готовый тип, который делает то, что делает ваш класс ArrayList, который сам делает то же самое и должен внутренне подавлять эти предупреждения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...