Список‹?› добавление и удаление элементов

В настоящее время я программирую плагин bukkit (bukkit — это тип сервера Minecraft;)) и у вас есть метод в классе с именем YamlConfiguration со следующим методом:

public List<?> getList(String path)

Моя проблема: я хотел бы добавить и/или удалить элементы из этого списка. Но когда я пытаюсь сделать это через

YamlConfiguration config = YamlConfiguration.load("path/to/config.yml");
config.getList("a.path").add(new String("foo"));

eclipse выдает ошибку, потому что

Метод add(capture#2-of ?) в типе List‹capture#2-of ?› неприменим для аргументов (String)

Я действительно не знаю, что делать. ^^'

С Уважением.


person mezzodrinker    schedule 21.03.2013    source источник
comment
Выясните, какого типа элементы в списке. Вы должны добавить элемент того же типа (который, очевидно, не является строкой).   -  person Stijn Haus    schedule 21.03.2013
comment
Если у вас есть список неограниченного типа (<?>), вы не можете ничего добавить к нему, и вы можете получить из него любой тип Object. Вам нужно связать тип. Попробуйте List<String>.   -  person John Dvorak    schedule 21.03.2013
comment
@StijnHaus Элементы - это строки. Я сохранил их как List<String> в этот файл и хотел бы, чтобы они возвращались как List<String, а не как List<?>... (сообщение Pastebin: ссылка)   -  person mezzodrinker    schedule 21.03.2013
comment
@JanDvorak Если я сделаю это, изменив свой код на List<String> list = (List<String>) config.getList("a.path"), eclipse скажет: Безопасность типов: непроверенное приведение из List‹capture#1-of ?› в List‹String›   -  person mezzodrinker    schedule 21.03.2013


Ответы (5)



List<?> list может указывать на список любого типа, например List<String> или List<Integer> или любой другой. Это означает, что вы не знаете, что такое фактический список, поэтому вам разрешено добавлять в этот список только null. Подробнее читайте в этом руководстве http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

person Evgeniy Dorofeev    schedule 21.03.2013

? — это подстановочный знак, который представляет неизвестный тип, потому что вы не знаете тип list<?>, поэтому вы не можете добавить в него какой-либо элемент.

person Foredoomed    schedule 21.03.2013

Если вы уверены, что он возвращает список строк, вы можете привести его:

((List<String>)config.getStringList("a.path")).add("foo");
person user2147970    schedule 21.03.2013
comment
если вы используете getStringList, вам не нужно использовать приведение к List<String>... :) - person mezzodrinker; 21.03.2013

Я думаю, вам нужно заменить <?> на <Object>, тогда вы можете добавить в свой список любые мысли, такие как Integer, String и т. Д. ...

удачи :)

person Erfan Bagheri    schedule 21.03.2013