小编Sam*_*Sam的帖子

Java无法使用双冒号运算符找到正确的重载方法

当使用双冒号运算符来引用重载方法时,Java似乎无法确定要使用的正确方法.考虑这个例子:

public class A {
    private void setter(final Number value) { }
    private void setter(final Optional<Number> value) { }
    private void setter2(final Optional<Number> value) { }

    private <T> void useSetter(final Consumer<Optional<T>> a) { }

    private void callMethod() {
        useSetter(this::setter); // Error here
        useSetter(this::setter2);
    }
}
Run Code Online (Sandbox Code Playgroud)

第一次调用useSetter不编译并给出以下错误:

Cannot infer type argument(s) for <T> useSetter(Consumer<Optional<T>>)
The type A does not define setter(Optional<Object>) that is applicable here
Run Code Online (Sandbox Code Playgroud)

但是,第二个调用编译得很好,这意味着问题在于重载setter.只有一个setter重载是适用的,所以我不明白为什么这不起作用.

可以通过使用指定参数类型的lambda解决这个问题,但这更详细.

useSetter((final Optional<Number> v) -> setter(v));
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理这种情况,或者我是否陷入了这个奇怪的怪癖?

java generics lambda java-8

12
推荐指数
1
解决办法
680
查看次数

标签 统计

generics ×1

java ×1

java-8 ×1

lambda ×1