Добавление обьектов в массив
От: PorcoRosso  
Дата: 25.02.10 15:56
Оценка:
Есть несколько классов, они связаны друг с другом в виде дерева.
Т.е. например обьект класса 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)".
Как можно добавить в коллекцию элемент в этом случае?
Re: Добавление обьектов в массив
От: Blazkowicz Россия  
Дата: 25.02.10 16:07
Оценка:
Здравствуйте, 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);
}
Re[2]: Добавление обьектов в массив
От: PorcoRosso  
Дата: 25.02.10 16:28
Оценка:
Здравствуйте, 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); // а вот эта строка не компилируется
        }
    }
}
Re[3]: Добавление обьектов в массив
От: Blazkowicz Россия  
Дата: 25.02.10 16:37
Оценка:
Здравствуйте, 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овские привычки называть методы с большой буквы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.