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();
}