Java generics применяют одинаковый тип для ключей и значений карты - программирование

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<?>> и просто утверждать, что ключ и значение одного типа во время выполнения. Тем не менее, мне было интересно, возможно ли это, строго используя дженерики.

4b9b3361

Ответ 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.