Java вопрос о ArrayList <Integer>[] x - PullRequest
5 голосов
/ 11 марта 2011

У меня всегда была эта проблема с массивами ArrayLists. Может быть, вы можете помочь.

//declare in class
private ArrayList<Integer>[] x;

//in constructor
x=new ArrayList[n];

Это генерирует предупреждение о непроверенной конверсии.

Но

x=new ArrayList<Integer>[n];

- ошибка компилятора.

Есть идеи?

Спасибо!

Ответы [ 6 ]

5 голосов
/ 11 марта 2011

Вы не можете создать массив списков генериков. К счастью, есть обходные пути. И, к счастью, есть замечательный сайт о Generics с большим количеством информации, чем вы когда-либо хотели бы знать. Ссылка идет прямо к части Arrays in Java Generics.

3 голосов
/ 11 марта 2011

Я думаю, что вы не можете создать массив универсального массива, потому что никакая общая информация не будет доступна во время выполнения. Вместо этого вы можете сделать так:

List<Integer>[] arr=new ArrayList[30];
arr[0]=new ArrayList<Integer>();//create new arraylist for every index.
0 голосов
/ 05 августа 2018

Что ж, похоже, вы хотите избежать предупреждения об Generics, когда просто пишете

ArrayList[] x=new ArrayList[n];

, а также убрать ошибку компиляции, x=new ArrayList<Integer>[n];

Вы можете использовать универсальный тип <?> для удовлетворения обоих условий, например:

ArrayList<?> x[]=new ArrayList[n];

Возможно, вы захотите обратиться к ссылке ниже, чтобы узнать больше о дженериках: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

0 голосов
/ 12 марта 2011

Это не должно было быть ошибкой. Предупреждение достаточно. Если никто не может создать ArrayList<Integer>[], нет никакого смысла разрешать тип.

Поскольку javac не делает нам одолжение, мы можем сами создать массив:

@SuppressWarnings("unchecked")
<E> E[] newArray(Class<?> classE, int length)
{
    return (E[])java.lang.reflect.Array.newInstance(classE, length);
}

void test()
    ArrayList<Integer>[] x;
    x = newArray(ArrayList.class, 10);

Ограничение типа не является идеальным, вызывающий должен убедиться, что передан точный класс. Хорошая новость заключается в том, что если передан неправильный класс, сразу возникает ошибка во время выполнения при присваивании результата x, поэтому быстро провалиться.

0 голосов
/ 11 марта 2011

Запустите текущий код:

public class Test {
    ArrayList<Long>[] f0;
    ArrayList<Long> f1;
    ArrayList[] f2;
    public static void main(String[] args) {
        Test t = new Test();
        Field[] fs = t.getClass().getDeclaredFields();
        for(Field f: fs ){
            System.out.println(f.getType().getName());
        }

    }

}

Вы получите:

[Ljava.util.ArrayList;
java.util.ArrayList
[Ljava.util.ArrayList;

Потому что Java не поддерживает универсальный массив. Когда вы объявляете:

private ArrayList<Integer>[] x;

Компилятор подумает, что это:

private ArrayList[] x;

Итак, вы должны сделать так:

int n = 10;
ArrayList<Long>[] f = new ArrayList[n];
for(int i=0;i<n;i++){
    f[i] = new ArrayList<Long>();
}
0 голосов
/ 11 марта 2011
ArrayList<?>[] x;
x=(ArrayList<? extends Integer>[]) new ArrayList<?>[10];
x[0] = new ArrayList(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...