2011-05-02 34 views
0

我有一個類Category,它實現了接口CategoryManager。接下來是Card,它保持List<Category>返回接口對象列表

現在我想返回這個列表,但類別爲CategoryManager,因此List<CategoryManager>。我這樣做的原因是Category的「公共接口」非常醜陋,我想通過向外部用戶顯示乾淨的CategoryManager來縮小範圍。

我該怎麼做?

我想出下面的方法:

public <T extends CategoryManager> List<T> getAllCategories() { 
      return (List<T>) categories; //with categories beeing List<Category> 

}

它的工作,但我覺得它比較難看,bacause我鑄造這裏返回List<T>,從而失去信息和...嗯,我想你會覺得這不是很好,因爲各種原因。

任何人都可以得到一個更好/更好的解決方案?

Regards :-)

+0

[Casting generic collection to base type]可能重複(http://stackoverflow.com/questions/539287/casting-a-generic-collection-to-base-type ) – 2011-05-02 19:10:09

+1

@ Will A - 這是Java,而不是C#。 – 2011-05-02 19:11:11

+0

@Justin - 好點,我的道歉 - 評論刪除。 – 2011-05-02 19:13:14

回答

1

在.NET示例中,持有同樣的觀點。您不應該在集合類型之間進行投射。它的工作原因是Java的erasure。如果你沒有收到演員的警告,我會有點驚訝。

最準確的方法是:

public List<? extends CategoryManager> getAllCategories() 
{ 
    return categories; 
} 

的缺點是,List<CategoryManager>是不一樣的List<? extends CategoryManager>。但是,它與方法名稱的建議意圖匹配。

+0

爲什麼,是的,這看起來更好!謝謝! – TeaOverflow 2011-05-02 19:26:56

1

有沒有必要的<T extends CategoryManager>位,這使得getAllCategories a generic method。這將工作得很好:

public class Category implements CategoryManager 
{ 
    List<Category> categories = new ArrayList<Category>(); 

    public List<? extends CategoryManager> getAllCategories() 
    { 
     return categories; 
    } 
}