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)
使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)