Java: параметризация объекта карты - PullRequest
3 голосов
/ 30 января 2011

У меня есть следующая глобальная переменная:

private Map<String,List<String>> network;

Я создаю его экземпляр в своем конструкторе следующим образом:

network = new Hashtable<String,ArrayList<String>>();

Приведенный выше пример не компилируется.Очевидно, что когда я параметризирую карту, я должен объявить, что это отображение именно из String в ArrayList вместо использования более общего List?Любое понимание того, почему я должен это делать?

Ответы [ 3 ]

5 голосов
/ 30 января 2011

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

network = new Hashtable<String,List<String>>();

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

network.put("Key", new ArrayList<String>());
3 голосов
/ 30 января 2011

Скорее наоборот: когда вы создаете новую HashTable, вам не нужно указывать, что вы собираетесь использовать ArrayLists в качестве значений. Вместо этого вы должны сказать

new Hashtable<String, List<String>>();

и выбор реализации List, которую вы собираетесь использовать в качестве значений, остается свободным.

1 голос
/ 30 января 2011

Вы также можете параметризовать вашу переменную как

private Map<String, ? extends List<String>> network;

См. Например http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Java для более подробной информации.

...