2011-05-02 51 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; 
    } 
}