Java: Поместите объекты различных типов в ArrayList для ModelCollection.Интерфейсы? - PullRequest
5 голосов
/ 14 сентября 2010

Я хочу, чтобы мои модели были упакованы в ModelCollection, которая в основном используется для ListView. Коллекция всегда имеет такие же атрибуты, как title, totalResults (для разбиения на страницы), и она должна содержать listItem-Models в «items» ArrayList. Однако эти модели имеют разные типы, такие как «ModelCategory» или «ModelChain», и часто имеют разные свойства и методы.

Как я могу достичь этого в Java с сильной дисциплиной набора текста? Я сердечный интерфейс правильный способ сделать это. ГДЕ я должен их реализовать?

public class ModelCollection {

              public ArrayList< ModelCategory OR ModelChain OR ModelXyz> items = new ArrayList<ModelCategory OR ModelChain OR ModelXyz>();

              private String id;
              private String title;
              private Long updated;

              private String linkSelf;
              private int totalResults;
              private int startIndex;

    /*
     more stuff like parsing a feed
    */

    }

Ответы [ 3 ]

9 голосов
/ 14 сентября 2010

Сделайте так, чтобы ваши ModelCategory, ModelChain и ModelXyz реализовали интерфейс. Тогда пусть ваша коллекция будет на этом интерфейсе.

Например:

public interface MyModel {
}

public class ModelCategory implements MyModel {
}

List<MyModel> list = new ArrayList<MyModel>();

Чтобы ссылаться на конкретные методы каждого класса, вам нужно привести объекты списка к правильному типу.

List<MyModel> list = new ArrayList<MyModel>();
list.add(new ModelCategory());

ModelCategory model = (ModelCategory) list.elementAt(0);

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

5 голосов
/ 14 сентября 2010

Решение Таурена правильное, но не забудьте проверить экземпляр, как предложено deadsven, и результат будет таким:

    List<MyModel> list = new ArrayList<MyModel>();
    list.add(new ModelCategory());

    for(MyModel mymodelListElement: list) {
        //mymodelListElement.sameMyModelMethods()

        if(ModelCategory instanceof mymodelListElement) {
            ModelCategory modelCategoryElement = (ModelCategory)mymodelListElement;
        } else if(ModelChain  instanceof mymodelListElement) {
            ModelChain  modelChainElement = (ModelChain )mymodelListElement;
        } else if(ModelXyz instanceof mymodelListElement) {
            ModelXyz modelXyzElement = (ModelXyz)mymodelListElement;
        } else {
            //ignore
            //or
            //throw new RuntimeException("Wrong MyModel implementation")
        }

    }
1 голос
/ 14 сентября 2010

Определите общий интерфейс для всех классов вашей модели, который дает доступ к общим свойствам.

public interface MooModel
  String getTitle();
  // etc

И определить List<MooModel>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...