繁体   English   中英

Java Generics,没有 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和/或转换为特定的子类
  • 向动物/鸟类/鱼类添加任何东西

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

如果你有一个超类的引用,那么如果你想执行一个特定的子类的方法,你必须强制转换到子类。 唯一不需要的情况是当方法在超类中是抽象的并在子类中实现时。 这是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM