При использовании оператора двойной колонки для обращения к перегруженному методу 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));
Есть ли лучший способ справиться с этой ситуацией или я столкнулся с этой странной причудой?