我有一个实现接口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>
}
它确实有效,但我发现它相当丑陋,因为我在这里投掷并返回List<T>
,从而失去了信息......嗯,我想你会认为它对各种各样不好的原因。
任何人都可以提供更好/更好的解决方案吗?
问候: - )
答案 0 :(得分:1)
同样的观点与.NET示例中的含义相同。您不应该在集合类型之间强制转换。它的工作原理是因为Java的erasure。如果你没有得到演员的警告,我会有点惊讶。
最准确的选择是:
public List<? extends CategoryManager> getAllCategories()
{
return categories;
}
否定的是List<CategoryManager>
与List<? extends CategoryManager>
不同。但是,它确实符合方法名称的建议意图。
答案 1 :(得分:1)
不需要<T extends CategoryManager>
位,这会使getAllCategories
成为generic method。这样可以正常工作:
public class Category implements CategoryManager
{
List<Category> categories = new ArrayList<Category>();
public List<? extends CategoryManager> getAllCategories()
{
return categories;
}
}