簡體   English   中英

Java調用枚舉的靜態方法,它作為類類型變量傳遞而不進行強制轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM