Java 泛型,如何在没有 instanceof 或转换的情况下做到这一点?
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
and/or 转换为特定的子类
- 添加任何东西到 Animal/Bird/Fish
任何对我研究有用的术语也会有帮助,干杯。
如果您有对超类的引用,那么如果您想要执行特定子类的方法,您必须强制转换为该子类。唯一不需要的情况是当方法在超类中是抽象的并在子类中实现时。这是继承在 Java.
中工作方式的一个基本方面
这不是创建泛型的目的。
泛型是为扩展静态时间类型检查而创建的...基本上,警告您不要尝试将 Bar
对象放入 Foo
集合中。
设计 SideEffect
的最佳方式是作为(静态或非静态)内部 class。您可以向 Fish 添加一个静态方法,例如
public static void registerSideEffect(SideEffect)
跟踪鱼可能产生的副作用。您可以做的另一件事是在 Animal 中,添加
public void applySideEffect(SideEffect<T> effect)
其中 T 是您的 Animal 通用类型。这可能有助于限制(在静态时间)将错误的 SideEffect 应用于 Animal
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
and/or 转换为特定的子类- 添加任何东西到 Animal/Bird/Fish
任何对我研究有用的术语也会有帮助,干杯。
如果您有对超类的引用,那么如果您想要执行特定子类的方法,您必须强制转换为该子类。唯一不需要的情况是当方法在超类中是抽象的并在子类中实现时。这是继承在 Java.
中工作方式的一个基本方面这不是创建泛型的目的。
泛型是为扩展静态时间类型检查而创建的...基本上,警告您不要尝试将 Bar
对象放入 Foo
集合中。
设计 SideEffect
的最佳方式是作为(静态或非静态)内部 class。您可以向 Fish 添加一个静态方法,例如
public static void registerSideEffect(SideEffect)
跟踪鱼可能产生的副作用。您可以做的另一件事是在 Animal 中,添加
public void applySideEffect(SideEffect<T> effect)
其中 T 是您的 Animal 通用类型。这可能有助于限制(在静态时间)将错误的 SideEffect 应用于 Animal