带有泛型类型的Java 8方法引用

Joh*_*ick 10 java generics lambda 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) { }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将构造函数调用更改为

    BiConsumer<TestEvent, Long> consumer = TestEvent::setId;
    new Mapper(consumer);
Run Code Online (Sandbox Code Playgroud)

一切正常.有人可以解释原因吗?

我知道如果我删除泛型类型(T)并使用Long代替它可行,但在解决我的实际问题时这不起作用.

Jon*_*eet 14

目前你正在尝试使用原始映射器类型,它会删除所有类型的东西.

一旦你开始使用泛型类型,一切都很好 - 类型推断可以帮助你:

new Mapper<>(TestEvent::setId);
Run Code Online (Sandbox Code Playgroud)

添加<>是使代码编译所需的全部内容.

  • downvoter可以解释这个答案有什么问题吗? (5认同)