java - 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 中无法覆盖接口中定义的静态方法。
解决方案
你不能。尽管具有相同的名称,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();
推荐阅读
- java - Java Question RobotSim on move through 2d string map with enum commands, certain characters & constraints
- python - 计算 pandas 中子组的百分比
- c++ - 在排序数组 C++ 中查找最接近数字的索引
- python - 如何将坐标转换为shapefile
- powershell - SharePoint 加载项权限不起作用
- django - 即使我在保存时从 django 模型中设置值,我的 postgresql 触发器也会执行吗?
- lodash - 如何在lodash中创建值总和数组
- r - R重新排序ggplot x轴以零结尾
- node.js - 当我尝试从 HomeScreen 打开产品时出现以下错误 - 将循环结构转换为 JSON -->
- excel - 如何循环遍历 Excel 行