【问题标题】:java generics and program-design, how to properly implement a list which contains subtypes of superclass?java泛型和程序设计,如何正确实现包含超类子类型的列表?
【发布时间】:2017-03-08 23:43:32
【问题描述】:

我有一个动物类和一些实际的动物,如老鼠、马……它们正在消耗类动物。现在我想创建一个班级人口。一个种群的列表只包含一种动物。

我可以运行这种方法,但它相当难看。使用通配符<? extends Animal> 我不需要任何演员表,但添加另一个动物是行不通的。当我只使用<Animal> 时,我总是必须进行强制转换,并且我必须为每种动物编写方法,例如add_mouse(),尽管所有这些方法几乎都可以做到。

我的第一个想法是为每种动物引入种群分类,但这也不是一个好的解决方案。

恳请您帮忙。有没有合适的方法可以完成,或者你能建议我另一个程序设计吗? 非常感谢。

【问题讨论】:

  • 我已经使用了一个列表,但是我在继承和泛型方面遇到了问题

标签: java oop generics inheritance collections


【解决方案1】:

您需要在您的 Population 类上设置一个上限类型变量,并且该类中的 List 被限制为仅包含该类型变量的实例:

class Population<A extends Animal> {
  final List<A> animals = new ArrayList<>();

  void add(A animal) {
    animals.add(animal);
  }
}

然后你可以像这样使用它:

Population<Dog> dogs = new Population<>();
dogs.add(new Dog());  // OK.

Population<Cat> cats = new Population<>();
cats.add(new Cat());  // OK.

dogs.add(new Cat());  // Compiler error.
cats.add(new Dog());  // Compiler error.

【讨论】:

  • 这正是我想要的。非常感谢。
  • 当一个答案解决了您的问题时,请点击答案旁边的复选标记接受它。
  • 当然可以,但我不得不等待几分钟。现在我可以接受了。
  • 对不起,我还要问一个问题。这在我从外部调用 add 时效果很好,但是当我想在人口类中调用 add() 时该怎么办?
  • 您致电add(animal)(或this.add(animal))。这与类外没有什么不同:您只能通过引用 A 或文字 null 来调用该方法。
猜你喜欢
  • 2015-08-25
  • 2011-01-31
  • 2011-10-16
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2019-11-18
相关资源
最近更新 更多