Как мне создать список универсальных массивов в Java? - PullRequest
0 голосов
/ 15 июня 2011

Я написал класс, который принимает универсальный тип, и я пытаюсь создать список массивов универсальных массивов внутри него. Я понимаю, что Java не может создавать универсальные массивы , но я также знаю, есть обходные пути . Есть ли способ, как может работать приведенный ниже код, или я лаю не на том дереве?

public class IterableContainer<T extends IterableItem> {
    private T[] itemArray;

    // how can i get this following line to work?
    private List<T[]> items = new ArrayList<T[10]>();

    public IterableContainer() {  

... etc ...

Проигнорируйте прошлое здесь - оказывается, это была проблема IDE.
Оставлено для преемственности вопросов и ответов.

EDIT:

Это также не работает:

private List<T[]> items = new ArrayList<T[]>();

с ошибкой:

Синтаксическая ошибка на токене ">", VariableDeclaratorId ожидается после этого токена

Ответы [ 5 ]

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

"... лай неправильного дерева ... , используйте List<List<T>>. Использование сырых массивов в Java - это почти всегда запах кода, нет причин не использовать правильную коллекцию классы.

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

Работает просто отлично, вы просто не можете использовать объявление T[10], так как длина массива не влияет на его тип.

т.е.

... = new ArrayList<T[]>();

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

1 голос
/ 16 июня 2011

Это допустимое объявление в java (согласно спецификации), которое прекрасно компилируется с javac, как прокомментировали другие.

public class IterableContainer<T extends IterableItem> {
  private T[] itemArray;

  private List<T[]> items = new ArrayList<T[]>();// valid

  ..........  

}

Я полагаю, что ошибка, которую вы видите, не выдается из Eclipse, возможно,из Android SDK, настроенного в Eclipse.Если вы создаете проект Java в Eclipse, этот код должен работать просто отлично.Если вы используете это в Android Project в Eclipse, вы, вероятно, столкнетесь с этим.У меня была эта ошибка при запуске этого кода из проекта Android:

#  guarantee(_name_index != 0 && _signature_index != 0) failed: bad constant pool index for fieldDescriptor

Похоже, что вы ограничены в проекте Android, к сожалению.

1 голос
/ 15 июня 2011
private List<T[]> items = new ArrayList<T[]>();

отлично работает на моей машине

Когда вы говорите "Я занимаюсь разработкой для мобильных устройств" .... вы ориентируетесь на j2me? В j2metargetng

нет поддержки обобщений
0 голосов
/ 15 июня 2011

Вы не определили T в этом коде.

Если вы создаете универсальный класс, вам нужно написать:

public class <T extends IterableItem> IterableContainer...

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

private List<T[]> items = new ArrayList<T[]>();

...