【发布时间】:2021-01-28 19:51:17
【问题描述】:
class Animal {}
class Fish extends Animal {
void swim() {
// fish specific logic/side effect
}
}
class Bird extends Animal {
void fly() {
// bird specific logic/side effect
}
}
interface SideEffect < T extends Animal > {
void mutateSomething(T);
}
class FishSideEffect implements SideEffect < Fish > {
@Override
void mutateSomething(Fish fish) {
fish.swim() // swim has fish specific side effects
}
}
void someMethod(Animal animal) {
FishSideEffect fishSideEffect = new FishSideEffect();
fishSideEffect(animal); // <- this won't work.
}
当方法参数是超类时,执行子类特定逻辑的最佳方式是什么?
我想避免
-
instanceof和/或转换为特定的子类 - 向动物/鸟/鱼添加任何东西
任何对我有用的术语都会有所帮助,干杯。
【问题讨论】:
-
什么是
Example? -
对不起,我已经改成
SideEffect -
如果你有一个超类的引用,那么如果你想执行一个特定的子类的方法,你必须强制转换为子类。唯一不这样做的情况是该方法在超类中是抽象的并在子类中实现。这是 Java 中继承工作方式的一个基本方面。
-
当然这个
fishSideEffect(animal);是行不通的。它需要一个Fish,而你传递一个Animal。在运行时,它可能是一个Fish,但在编译时这无关紧要,这将失败。 -
@JimGarrison 欢呼,这很有帮助。我想这就是它的工作原理,但想要第二个意见 - 欣赏这一点。
标签: java oop generics polymorphism