Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Положить в HashMap одинаково параметризованные дженерики

Предположим, есть следующая иерархия классов:
static interface A { void roll(); }
static class B implements A { @Override public void roll() { System.out.println("B"); } }
static class C implements A { @Override public void roll() { System.out.println("C"); } }
Требуется положить в HashMap следующее: map.put(Class, List), где E - класс, наследующийся от A, причем, нужно запретить класть разноименно параметризованные классы. Пример: Должно компилироваться:
map.put(Class,List); map.put(Class,List);
Ошибка компиляции:
map.put(Class, List);
Как это можно реализовать, если вообще такое возможно?


Ответ

Если я правильно понял вопрос, то нужно сделать так:
private static Map, List> getMap() { return new HashMap<>(); }
И использовать этот метод следующим образом:
Map, List> map = getMap(); map.put(B.class, new ArrayList<>()); map.put(C.class, new ArrayList<>()); //<- ошибка компиляции
UPDATE
Боюсь, то что вы хотите, нельзя сделать без создания дополнительного класса, который реализовывал бы данное ограничение.
Например так:
private static class CustomMap { private final Map, List> map = new HashMap<>();
@SuppressWarnings("unchecked") public

List

get(P key) { return (List

) map.get(key); }
@SuppressWarnings("unchecked") public

List

put(Class

key, List

value) { return (List

) map.put(key, value); } }
Тогда,
CustomMapmap = new CustomMap<>() ;
map.put(C.class, new ArrayList()); map.put(B.class, new ArrayList()); map.put(C.class, new ArrayList()); //<-- ошибка компиляции
Но в данном решении есть существенные недостатки, одно из них это то, что CustomMap не реализовывает интерфейс Map

Комментариев нет:

Отправить комментарий