Java вызывает статический метод enum, который передается как переменная типа класса без приведения - PullRequest
0 голосов
/ 26 мая 2018

У меня есть два перечисления:

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.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Обычно я бы использовал интерфейсы.Проблема в том, что переопределение статического метода, определенного в интерфейсе, невозможно в Java.

Да, но вы можете заключить вызов в интерфейс.Используя ссылки на методы, это довольно просто:

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

private void callMe(Runnable m) {
    m.run();
}
0 голосов
/ 26 мая 2018

Вы не можете.Несмотря на одинаковое имя, 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...