【问题标题】:How can I have an abstract method that accepts an argument of type "my type"?我怎样才能有一个接受“我的类型”类型参数的抽象方法?
【发布时间】:2017-06-20 17:13:21
【问题描述】:

假设我有一个带有抽象方法的抽象类 Animal

public abstract Animal mateWith(Animal mate);

问题是,如果我创建子类 Snake 和 Armadillo,那么这样的调用将是合法的:

mySnake.mateWith(myArmadillo);

但我只希望蛇能够与蛇交配。我需要能够定义这样的东西:

public abstract Animal_Of_My_Class mateWith(Animal_Of_My_Class mate);

这在 Java 中可行吗?

【问题讨论】:

  • 在 C++ 中,您可以使用 RTTI (dynamic_cast),它有点“反多态性”。
  • “我只希望蛇能够与蛇交配。”来吧,给爱一个机会。
  • @Kayaman 确实如此。这种设计不允许您建模,例如,狮子与狮子和a Lion mating with a Tiger 交配。

标签: java oop abstract-class


【解决方案1】:

自界泛型的救援:

abstract class Animal<T extends Animal<T>> {
  abstract T mateWith(T mate);
}

然后:

class Animal_Of_My_Class extends Animal<Animal_Of_My_Class> {
  Animal_Of_My_Class mateWith(Animal_Of_My_Class mate) { ... }
}

请注意,您不能将 T 限制为实现类(例如,您不能要求 Animal_Of_My_Class extends Animal&lt;Animal_Of_My_Class&gt; 而不是 Animal_Of_My_Class extends Animal&lt;Another_Animal_Of_My_Class&gt;)。

【讨论】:

  • 那么这种事情是常见的,还是不鼓励的?我担心我可能会过度设计。
  • 什么样的东西?自界泛型?他们在这里和那里突然出现,例如在抽象构建器中。
  • 使用这个模式来实现一个只接受“我的类型”参数的方法。该声明的复杂性让我想知道我是否不应该首先尝试这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多