Java:将不同类型的对象放入ModelList的ArrayList中.接口?

One*_*rld 5 java types interface arraylist

我希望我的模型包含在一个主要用于ListView的ModelCollection中.Collection总是具有相同的属性,如title,totalResults(用于分页),它应包含ArrayList"items"中的listItem-Models.但是,这些模型具有不同的类型,如"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
    */

    }
Run Code Online (Sandbox Code Playgroud)

Tau*_*ren 9

使ModelCategory,ModelChain和ModelXyz实现一个接口.然后将您的收藏放在该界面上.

例如:

public interface MyModel {
}

public class ModelCategory implements MyModel {
}

List<MyModel> list = new ArrayList<MyModel>();
Run Code Online (Sandbox Code Playgroud)

要引用每个类的特定方法,您需要将列表对象强制转换为正确的类型.

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

ModelCategory model = (ModelCategory) list.elementAt(0);
Run Code Online (Sandbox Code Playgroud)

显然,您可以使用所需的任何方法来迭代集合.


小智 5

牛头人的解决方案是正确的,但记得检查像deadsven提出的instanceof,结果如下:

    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")
        }

    }
Run Code Online (Sandbox Code Playgroud)