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);
}
}
第一次调用 不会编译,并给出以下错误: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
但是,第二个调用编译得很好,这意味着问题出在 重载 。只有一个重载是适用的,所以我不明白为什么这不起作用。setter
setter
可以通过使用指定参数类型的 lambda 来解决此问题,但这要详细得多。
useSetter((final Optional<Number> v) -> setter(v));
有没有更好的方法来处理这种情况,或者我被困在这个奇怪的怪癖上?