Подтвердить что ты не робот

Ошибка создания общего массива

Я пытаюсь сделать что-то вроде этого: -

public static ArrayList<myObject>[] a = new ArrayList<myObject>[2];

myObject - это класс. Я получаю эту ошибку: - Создание общего массива (стрелка указывает на новый.)

4b9b3361

Ответ 1

У вас не может быть массивов общих классов. Java просто не поддерживает его.

Вам следует рассмотреть возможность использования коллекции вместо массива. Например,

public static ArrayList<List<MyObject>> a = new ArrayList<List<MyObject>();

Другим "обходным путем" является создание вспомогательного класса, такого как

class MyObjectArrayList extends ArrayList<MyObject> { }

а затем создайте массив MyObjectArrayList.


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

List<String>[] lsa = new List<String>[10]; // illegal
Object[] oa = lsa;  // OK because List<String> is a subtype of Object
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[0] = li; 
String s = lsa[0].get(0); 

Ответ 2

Существует более простой способ создания общих массивов, чем использование List.

Во-первых, пусть

public static ArrayList<myObject>[] a = new ArrayList[2];

Затем инициализируйте

for(int i = 0; i < a.length; i++) {
     a[i] = new ArrayList<myObject>();
}

Ответ 3

Вы можете сделать

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList<?>[2];

или

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList[2];

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

Ответ 4

если вы пытаетесь объявить arraylist своего общего класса, вы можете попробовать:

public static ArrayList<MyObject> a = new ArrayList<MyObject>();

это даст вам arraylist myobject (размер 10), или если вам нужен только аррайалист размером 2, который вы можете сделать:

public static ArrayList<MyObject> a = new ArrayList<MyObject>(2);

или вы можете попытаться создать arraylist arraylists:

public static ArrayList<ArrayList<MyObject>> a = new ArrayList<ArrayList<MyObject>>();

хотя я не уверен, что последнее, что я сказал, правильно...

Ответ 5

Мне кажется, что вы используете неправильный тип скобок. Причина, по которой вы не можете определить массив общих, - это тип erasure.

Плюс, объявление переменной "a" является хрупкой, она должна выглядеть так:

List<myObject>[] a;

Не используйте конкретный класс, если вы можете использовать интерфейс.