Java 8 Method reference with generic types

2019-06-16 05:10发布

I am having issues with Java 8 method reference combined with generic types. I have simplified my problem to make it clear where the problem lies. The following code fails:

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) { }
}

But if I change the constructor invocation to

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

Everything works. Can someone explain why?

I know that it works if I remove the generic type (T) and use Long instead, but that will not work when solving my real problem.

1条回答
孤傲高冷的网名
2楼-- · 2019-06-16 05:49

Currently you're trying to use the raw mapper type, which erases all kinds of things.

As soon as you start using the generic type, all is fine - and type inference can help you:

new Mapper<>(TestEvent::setId);

Adding <> is all that's required to make your code compile.

查看更多
登录 后发表回答