Java generics применяют одинаковый тип для ключей и значений карты
То, что я ищу:
Я ищу, чтобы создать что-то, что принудительно вводит тип как для ключей, так и для значений карты: вроде как Map<Key<X>, Value<X>>
. Тем не менее, я хотел бы дополнительно обеспечить, чтобы типы соответствовали каждой записи ключа/значения, но между записями не нужно вводить тип.
Например, на той же карте эти пары ключ/значение должны считаться действительными:
-
Key<Integer>
отображается в Value<Integer>
-
Key<String>
отображается на Value<String>
-
Key<Double>
отображается на Value<Double>
Однако подобное недопустимо:
-
Key<Integer>
отображение в Value<String>
-
Key<Double>
отображение в Value<Boolean>
Как это сделать с использованием дженериков Java?
То, что я не ищу:
-
Я понимаю, что я могу реализовать что-то вроде Set<Pair>
, где
Пара принимает ключ/значение того же типа. Однако, глядя на это
ключ больше не будет работать с постоянным временем.
-
Я понимаю, что могу сделать что-то вроде Map<Key<?>, Value<?>>
и просто утверждать, что ключ и значение одного типа во время выполнения.
Тем не менее, мне было интересно, возможно ли это, строго используя дженерики.
Ответы
Ответ 1
Вы можете сделать это, но вам нужно перевернуть собственную оболочку поверх Map
:
class MyTypeSafeMap {
private Map<Key<?>, Value<?>> map;
public <T> void put(Key<T> key, Value<T> value) {
map.put(key, value);
}
public <T> Value<T> get(Key<T> key) {
return (Value) map.get(key);
// we know it safe, but the compiler can't prove it
}
}
Сравните, например, Guava ClassToInstanceMap
.