Есть несколько классов, они связаны друг с другом в виде дерева.
Т.е. например обьект класса A содержит коллекцию обьектов класса Б, а обьект класса Б содержит коллекцию обьектов Г и Д.
Есть метод-помошник для заполнения коллекций. Он нужное количество раз в цикле обращается к функции, создающей обьект и добавляет его в коллекцию. Метод этот статический.
Проблема вот в чем. Если в классе А определена коллекция ArrayList<Б>, то передать ее в метод-помошник я не могу — метод один, а коллекции для разных типов. Я могу передать туда эту коллекцию как ArrayList<? estends Object>. Но в этом случае при добавлении в коллекцию возникает ошибка "The method add(capture#3-of ? extends Object) in the type ArrayList<capture#3-of ? extends Object> is not applicable for the arguments (Object)".
Как можно добавить в коллекцию элемент в этом случае?
Здравствуйте, PorcoRosso, Вы писали:
PR>Есть несколько классов, они связаны друг с другом в виде дерева.
PR>Т.е. например обьект класса A содержит коллекцию обьектов класса Б, а обьект класса Б содержит коллекцию обьектов Г и Д.
PR>Есть метод-помошник для заполнения коллекций. Он нужное количество раз в цикле обращается к функции, создающей обьект и добавляет его в коллекцию. Метод этот статический.
PR>Проблема вот в чем. Если в классе А определена коллекция ArrayList<Б>, то передать ее в метод-помошник я не могу — метод один, а коллекции для разных типов. Я могу передать туда эту коллекцию как ArrayList<? estends Object>. Но в этом случае при добавлении в коллекцию возникает ошибка "The method add(capture#3-of ? extends Object) in the type ArrayList<capture#3-of ? extends Object> is not applicable for the arguments (Object)".
PR>Как можно добавить в коллекцию элемент в этом случае?
По-моему надо не через wildcard делать, а через generic method. Но без кода сложно разобратся. Можно пример? Сходу правильно не напишу, то идея такая:
void <T> add(T element, List<T> list)
{
list.add(element);
}
Здравствуйте, Blazkowicz, Вы писали:
B> Но без кода сложно разобратся. Можно пример?
public class Skin {
public String Name;
private ArrayList<Section> Sections = new ArrayList<Section>(); // Та самая коллекция объектов, которую надо заполнить, тип - стандартный java.util.ArrayList
public void Parse(XmlPullParser parser) throws Exception {
this.Name = ParserHelper.GetString(parser, "Name", "Unnamed skin");
ParserHelper.ParseCollections(parser, "Sections", this.Sections); // пытаемся заполнить коллекцию
}
}
public final class ParserHelper {
private static void ParseCollection(XmlPullParser parser, String name, ArrayList<? extends Object> coll) throws Exception {
for (НЕВАЖНО) {
Object item = ParserHelper.ParseObject(parser, name); // В общем откуда-то получили нужный объект, это Section в данном случае
coll.add(item); // а вот эта строка не компилируется
}
}
}
Здравствуйте, PorcoRosso, Вы писали:
PR>PR>public class Skin {
PR> public String Name;
PR> private ArrayList<Section> Sections = new ArrayList<Section>(); // Та самая коллекция объектов, которую надо заполнить, тип - стандартный java.util.ArrayList
PR> public void Parse(XmlPullParser parser) throws Exception {
PR> this.Name = ParserHelper.GetString(parser, "Name", "Unnamed skin");
PR> ParserHelper.ParseCollections(parser, "Sections", this.Sections); // пытаемся заполнить коллекцию
PR> }
PR>}
PR>public final class ParserHelper {
PR> private static void ParseCollection(XmlPullParser parser, String name, ArrayList<? extends Object> coll) throws Exception {
PR> for (НЕВАЖНО) {
PR> Object item = ParserHelper.ParseObject(parser, name); // В общем откуда-то получили нужный объект, это Section в данном случае
PR> coll.add(item); // а вот эта строка не компилируется
PR> }
PR> }
PR>}
PR>
Ну, всё правильно. Смысл в чем. Если бы можно было добавить Object в коллекцию, то ты бы в ArrayList<Section> мог бы засунуть любой тип. Это "типа" не безопасно.
Решение должно быть где-то таким. Придется либо ParseObject() делать типобезопасным. Либо тупо кастить в этом методе к T.
public final class ParserHelper {
private static <T> void ParseCollection(XmlPullParser parser, String name, ArrayList<T> coll, Class collectionType) throws Exception {
for (НЕВАЖНО) {
T item = ParserHelper.ParseObject(parser, name, collectionType); // В общем откуда-то получили нужный объект, это Section в данном случае
coll.add(item); // а вот эта строка не компилируется
}
}
}
И бросайте свои .NETовские привычки называть методы с большой буквы.