Общий ключ карты должен разрешать только два класса и иметь значение одного класса - PullRequest
0 голосов
/ 18 января 2019

Используя дженерики, я хочу, чтобы мой метод параметризовался так, чтобы он принимал карту ключа (A или B) и значение в качестве модели, которое впоследствии преобразуется в карту Map<UUID, Model>

Проблема в том, что я получаю сообщение об ошибке entry.getKey().getId() b / c. Я не определил, что это? ключ. Может кто-нибудь помочь?

public void method(Map<?, Model> map) {
  Map<UUID, Model> transformation =
      map.entrySet().stream()
          .collect(
              Collectors.toMap(entry -> entry.getKey().getId(), entry -> entry.getValue()));
}

class S {
  protected UUID getId() {
    // return UUID
  }
}

class A extends S {}

class B extends S {}

class Model {
  // bla bla
}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Поскольку A и B оба расширяют S, универсальный ключ для вашего map может быть просто S:

public void method(Map<? extends S, Model> map) {

В настоящее время вы можете сделать немногоограничить использование других потомков S ключом на карте (до тех пор, пока Java не получит запечатанные классы), кроме создания некоторого интерфейса, который реализуют A и B, и последующего использования этого интерфейса в качестве универсального ключа map.

0 голосов
/ 18 января 2019

Если A и B реализуют общий интерфейс, предлагающий метод getId(), связывают шаблон с этим:

public void method(Map<? extends S, Model> map) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...