Могу ли я передать Class в качестве параметра конструктора enum, а затем использовать его в качестве возвращаемого типа в методе? - PullRequest
2 голосов
/ 22 апреля 2020

Моя цель состоит в том, чтобы сделать метод следующим образом:

Map<String, Object> dataMap = new HashMap<>();

public ClassThatIsPassedToEnum someGetterMethod(MyEnum en){
   String key = en.keyInMap;
   Class<?> clazz = en.type;
   Object value = dataMap.get(key);
   //this method should return 'value' but casted to type from my enum
}

и перечисление выглядит следующим образом

enum MyEnum{
    EXAMP("example", Boolean.class);

    String keyInMap;
    Class<?> type;

    MyEnum(String keyInMap, Class<?> type){
        this.keyInMap = keyInMap;
        this.type = type;
    }
}

, а затем сделать это:

Boolean v = someGetterMethod(MyEnum.EXAMP);

Возможно ли это в java?

1 Ответ

2 голосов
/ 23 апреля 2020

Вы не можете сделать это с помощью перечисления.

Но вы можете сделать это с помощью непубличного экземпляра класса.

class MyNotEnum<T> {
    static final MyNotEnum EXAMP = new MyNotEnum<>("example", Boolean.class);

    String keyInMap;
    Class<T> type;

    private MyEnum(String keyInMap, Class<T> type){
        this.keyInMap = keyInMap;
        this.type = type;
    }
}

На самом деле, значения перечисления просто устано c окончательные поля внутри класса enum. Вы получаете несколько других вещей бесплатно (например, метод valueOf, устойчивость к рефлексивному воплощению и др. c), но это большая часть того, что есть в перечислении. Делая это самостоятельно, вы получаете возможность добавлять различные значения generi c между значениями.

Тогда:

public <T> T someGetterMethod(MyNotEnum<T> en){
   String key = en.keyInMap;
   Class<T> clazz = en.type;
   Object value = dataMap.get(key);
   return clazz.cast(value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...