2010-09-14 38 views
4

我想將我的模型包裝在主要用於ListView的ModelCollection中。該集合總是具有相同的屬性,如title,totalResults(用於分頁),並且它應包含ArrayList「items」中的listItem-Models。 但是,這些模型具有不同的類型,如「ModelCategory」或「ModelChain」,並且通常具有不同的屬性和方法。Java:將不同類型的對象放入ModelCollection的ArrayList中。 Interaces?

如何在具有強大打字規則的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 
    */ 

    } 

回答

9

讓你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); 

很明顯,您可以使用您需要的任何方法來遍歷您的集合。牛頭人的

1

爲所有模型類定義一個通用接口,它允許訪問它們共享的屬性。

public interface MooModel 
    String getTitle(); 
    // etc 

,並定義List<MooModel>

+0

好,以及如何代碼看起來在我的視圖控制器/活動?我如何訪問ModelCategory的特殊方法? – OneWorld 2010-09-14 08:13:44

+1

使用「instanceof」關鍵字來檢查你擁有的具體模型,然後將你的對象轉換爲特定的類。 – rompetroll 2010-09-14 08:28:36

+0

用於處理每個具體模型的特殊情況我會看看訪問者模式:) – willcodejavaforfood 2010-09-14 08:28:45

5

解決方案是正確的,但記得要檢查的instanceof像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") 
     } 

    } 
+0

您在if條件中顛倒語句...它應該是if(mymodelListElement instanceof ModelCategory).....希望它節省了某人的時間 – praveenb 2013-01-24 13:14:32

相關問題