首页 > 解决方案 > Java调用枚举的静态方法,作为类类型变量传递而不进行强制转换

问题描述

我有两个枚举:

public enum Animal {
    DOG, CAT
    public static void die() {
        // ...
    }
}

public enum Plant {
    APPLE, GRASS
    public static void die() {
        // ...
    }
}

我有以下逻辑

private void startHere() {
    callMe(Animal.class);
    callMe(Plant.class);
}

private void callMe(Class<?> _class) {
    if (_class == Plant.class) {
        Plant.class.cast(_class).die(); // OK
    }

    if (_class == Animal.class) {
        Animal.class.cast(_class).die(); // ok
    }
}

如何动态处理_class参数并在其上调用相应的die()静态方法,而无需进行 if 比较和强制转换?

通常我会使用接口。问题是在 Java 中无法覆盖接口中定义的静态方法。

标签: javaenumsinterfacecasting

解决方案


你不能。尽管具有相同的名称,Animal.die()并且Plant.die()是无关的功能。没有通用的方法来调用它们。

“die”这个名字表明它们应该是实例方法,而不是静态方法。动物个体会死,是吗?不是动物班?如果你让它们成为实例方法,那么你可以让两个枚举实现一个公共接口:

interface Mortal {
    void die();
}

enum Animal implements Mortal { ... }
enum Plant  implements Mortal { ... }

或者,如果您确实打算将它们设为静态,则可以将if语句替换为基于映射的查找。它仍然不是编译时构造,但避免了强制转换。

Map<Class<?>, Runnable> killers = new HashMap<>();
killers.add(Plant .class, Plant ::die);
killers.add(Animal.class, Animal::die);

...

killers.get(_class).run();

推荐阅读