Java 8 Ссылка на метод с общими типами

У меня возникают проблемы с ссылкой на метод Java 8 в сочетании с типичными типами. Я упростил свою проблему, чтобы дать понять, где проблема. Не удалось выполнить следующий код:

public static void main(String[] args) {
    new Mapper(TestEvent::setId);
}

private static class Mapper<T> {
    private BiConsumer<TestEvent, T> setter;
    private Mapper(BiConsumer<TestEvent, T> setter) { this.setter = setter; }
}

private static class TestEvent {
    public void setId(Long id) { }
}

Но если я изменю вызов конструктора на

    BiConsumer<TestEvent, Long> consumer = TestEvent::setId;
    new Mapper(consumer);

Все работает. Может кто-нибудь объяснить, почему?

Я знаю, что он работает, если я удалю общий тип (T) и использую Long вместо этого, но это не сработает при решении моей реальной проблемы.

Ответ 1

В настоящее время вы пытаетесь использовать тип raw mapper, который стирает всевозможные вещи.

Как только вы начнете использовать общий тип, все в порядке - и вывод типа может помочь вам:

new Mapper<>(TestEvent::setId);

Добавление <> - это все, что требуется для компиляции вашего кода.