[英]Java Generics, how to do this without instanceof or casting?
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
和/或转换为特定的子类任何对我研究有用的术语也会有所帮助,干杯。
如果你有一个超类的引用,那么如果你想执行一个特定的子类的方法,你必须强制转换到子类。 唯一不需要的情况是当方法在超类中是抽象的并在子类中实现时。 这是 inheritance 在 Java 中工作方式的一个基本方面。
这不是创建 generics 的目的。
Generics 是为扩展 static 时间类型检查而创建的...基本上,警告您不要尝试将Bar
object 放入Foo
集合中。
设计SideEffect
的最佳方法是作为(静态或非静态)内部 class。您可以向 Fish 添加一个 static 方法,例如
public static void registerSideEffect(SideEffect)
跟踪 Fish 可能产生的副作用。 您可以做的另一件事是在 Animal 中,添加
public void applySideEffect(SideEffect<T> effect)
其中 T 是您的 Animal 通用类型。 这可能有助于限制(在 static 时间)将错误的 SideEffect 应用于 Animal
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.