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. 

}

当方法参数是超类时,执行子类特定逻辑的最佳方式是什么?

我想避免

任何对我研究有用的术语也会有帮助,干杯。

如果您有对超类的引用,那么如果您想要执行特定子类的方法,您必须强制转换为该子类。唯一不需要的情况是当方法在超类中是抽象的并在子类中实现时。这是继承在 Java.

中工作方式的一个基本方面

这不是创建泛型的目的。

泛型是为扩展静态时间类型检查而创建的...基本上,警告您不要尝试将 Bar 对象放入 Foo 集合中。

设计 SideEffect 的最佳方式是作为(静态或非静态)内部 class。您可以向 Fish 添加一个静态方法,例如

public static void registerSideEffect(SideEffect) 

跟踪鱼可能产生的副作用。您可以做的另一件事是在 Animal 中,添加

public void applySideEffect(SideEffect<T> effect) 

其中 T 是您的 Animal 通用类型。这可能有助于限制(在静态时间)将错误的 SideEffect 应用于 Animal