Java: Как инициализировать список типизированных объектов? - PullRequest
1 голос
/ 27 августа 2011

Так что я долго искал ответ на этот вопрос, и я просто не уверен, как он работает.

Я пытаюсь составить список BloomFilter<String> объектов.

Определение класса для BloomFilter:

public class BloomFilter<E> implements Serializable { ...

<E> позволяет пользователю выбрать, какой тип элементов входит в фильтр. В моем случае мне нужны строки.

Где-то еще в программе мне нужно 4 BloomFilter<String> объектов.

Мой вопрос: как мне инициализировать следующую строку?

private static BloomFilter<String> threadedEncrpytionFilters[] = null;
threadedEncryptionFilters = ???

Это похоже на создание списка ArrayLists? Это тоже возможно?

Ответы [ 3 ]

4 голосов
/ 27 августа 2011

Увидев, что кто-то уже ответил на этот вопрос, я хотел удалить этот ответ, но по комментариям вижу, что люди все еще в замешательстве, так что вот так:)

В спецификации четко указано, что то, что вы хотите сделать, является незаконным. Значение:

BloomFilter<String> threadedEncrpytionFilters[] = new BloomFilter<String>[4];

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

  • сырые виды
  • неограниченный тип шаблона параметров подстановки

Обходной путь для вашей проблемы, как уже говорилось, изменить массив на List<BloomFiler<String>>.

Это поведение на самом деле довольно логично, если принять во внимание то, как Java обрабатывает универсальные типы на разных этапах (компиляция, время выполнения и т. Д.). Поняв, что вы увидите, что массивы конкретных универсальных типов не будут безопасными для типов. Вот очень хорошая статья на эту тему: http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ104

2 голосов
/ 27 августа 2011
List<BloomFilter<String>> list = new ArrayList<BloomFilter<String>>();
list.add(new BloomFilter<String>());
list.add(new BloomFilter<String>());
list.add(new BloomFilter<String>());
// ... and so on
1 голос
/ 27 августа 2011

Учтите это:

private static List<BloomFilter<String>> threadedEncrpytionFilters = 
    new ArrayList<BloomFilter<String>>();
...