简体   繁体   中英

Java 8 Method reference with generic types

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM