Ссылка Java на метод, который принимает подкласс другого класса - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь передать подкласс в качестве параметра методу.До сих пор я не был успешным, и даже сказал, что это невозможно сделать на JavaМне нужно мнение о стеке потока и предложения, чтобы он работал.

Давайте предположим, что 'HelloEvent' расширяет 'Событие' ...

У меня есть метод:

public void addListener(Consumer<? extends Event> consumer) { 
     [...]
}

и другой метод:

public void listen(HelloEvent helloEvent) { 
    [...]
}

Я хочу сделать это:

addListener (this :: listen);

В IDEA у меня ошибка 'Не удается разрешитьметод прослушивания ».Конечно, это происходит потому, что «listen» - это не событие, а подкласс.

Есть ли способ сделать это?Может быть, это обходной путь?

Я пытался сделать так, чтобы он был функцией или заменял 'extends' на 'super', и он не работает.Я пытался решить эту проблему в течение нескольких недель.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Даже если бы вы могли сделать это, вы получите ClassCastException, когда вызывается слушатель.Однако, если вы включили тип с addListener, вы можете добавить логику для фильтрации этого.

void addListener(Consumer<? super Event> listener) {
    [...]
}
<T extends Event> void addListener(Class<T> type, Consumer<T> listener) {
    addListener(evnt -> {
        if (type.isInstance(evnt))
            listener.accept(evnt);
    });
}
0 голосов
/ 13 июня 2018

Ну, вы не можете просто listen с любым Event, только с HelloEvent с.

Вероятно, это должно быть Consumer<? super Event>, потому что, например, Что такое PECS (производитель расширяет Consumer Super)? .

В этом случае вы могли бы написать

addListener(event -> {
  if (event instanceof HelloEvent) {
    listen((HelloEvent) event);
  }
});

... но, честно говоря, ничего из этого не сработает.Вы должны убедиться, что это HelloEvent явно.

...