[英]Java call static method of enum that is passed as class type variable without casting
我有兩個枚舉:
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中是不可能的。
是的,但您可以在界面中包裝呼叫。 使用方法引用非常簡單:
private void startHere() {
callMe(Animal::die);
callMe(Plant::die);
}
private void callMe(Runnable m) {
m.run();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.