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

Java:将不同类型的对象放入ModelCollection的ArrayList中。接口?,java,interface,types,arraylist,Java,Interface,Types,Arraylist,我想将我的模型包装在一个模型集合中,该集合主要用于ListView。集合始终具有相同的属性,如title、totalResults(用于分页),并且集合应包含ArrayList“items”中的listItem模型。 但是,这些模型有不同的类型,如“ModelCategory”或“ModelChain”,并且通常具有不同的属性和方法 如何在java中使用强大的类型规则来实现这一点?我认为这样做是正确的。我必须在哪里实施它们 public class ModelCollection {

我想将我的模型包装在一个模型集合中,该集合主要用于ListView。集合始终具有相同的属性,如title、totalResults(用于分页),并且集合应包含ArrayList“items”中的listItem模型。 但是,这些模型有不同的类型,如“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
    */

    }
公共类模型集合{
公共ArrayListitems=new ArrayList();
私有字符串id;
私有字符串标题;
私人长期更新;
私有字符串链接自身;
私人投资结果;
私人int startIndex;
/*
更多的东西,比如解析提要
*/
}

为所有模型类定义一个公共接口,该接口允许访问它们共享的属性

public interface MooModel
  String getTitle();
  // etc

并定义
列表

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

例如:

public interface MyModel {
}

public class ModelCategory implements MyModel {
}

List<MyModel> list = new ArrayList<MyModel>();
公共接口MyModel{
}
公共类ModelCategory实现了MyModel{
}
列表=新的ArrayList();
要引用每个类的特定方法,需要将列表对象强制转换为正确的类型

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

ModelCategory model = (ModelCategory) list.elementAt(0);
List List=new ArrayList();
添加(新模型类别());
modelcegory model=(modelcegory)list.elementAt(0);

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

Tauren的解决方案是正确的,但请记住检查instanceof like 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")
        }

    }
List List=new ArrayList();
添加(新模型类别());
用于(MyModel mymodelListElement:list){
//mymodelListElement.sameMyModelMethods()
if(mymodelListElement的ModelCategory实例){
ModelCategory modelCategoryElement=(ModelCategory)mymodelListElement;
}else if(mymodelListElement的ModelChain实例){
ModelChain modelChainElement=(ModelChain)mymodelListElement;
}else if(mymodelListElement的ModelXyz实例){
ModelXyz modelXyzElement=(ModelXyz)mymodelListElement;
}否则{
//忽略
//或
//抛出新的RuntimeException(“错误的MyModel实现”)
}
}

好的,那么代码在我的视图控制器/活动中看起来如何?如何访问ModelCategory的特殊方法?使用“instanceof”关键字检查您拥有的具体模型,然后将您的对象强制转换到特定的类。对于处理每个具体模型的特殊情况,我将查看访问者模式:)您在if条件下反转了语句。。。它应该是(mymodelListElement instanceof ModelCategory)。。。。。希望能节省一些时间