Java调用枚举的静态方法,该方法作为类类型变量传递而不强制转换

Java调用枚举的静态方法,该方法作为类类型变量传递而不强制转换,java,enums,interface,casting,Java,Enums,Interface,Casting,我有两个枚举: public enum Animal { DOG, CAT public static void die() { // ... } } public enum Plant { APPLE, GRASS public static void die() { // ... } } 我对以下逻辑有一个解释 private void startHere() { callMe(Animal.clas

我有两个枚举:

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
    }
}
private void startHere(){
callMe(动物类);
callMe(植物类);
}
私有无效调用(类_类){
如果(_class==Plant.class){
Plant.class.cast(_class.die();//确定
}
如果(_class==Animal.class){
Animal.class.cast(_class.die();//好的
}
}
我如何处理
\u class
参数,并在其上动态调用相应的
die()
静态方法,而不进行if比较和转换


通常我会使用接口。问题是在Java中不可能重写接口中定义的静态方法。

您不能。尽管名称相同,
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();
Map
通常我会使用接口。问题是在Java中不可能重写接口中定义的静态方法

是的,但是您可以将调用包装在接口中。使用方法引用非常简单:

private void startHere() {
    callMe(Animal::die);
    callMe(Plant::die);
}

private void callMe(Runnable m) {
    m.run();
}