Я играю с java8 lambdas, и я наткнулся на ошибку компилятора, которую я не ожидал.
Скажем, у меня есть функциональные interface A
, abstract class B
и class C
с перегруженными методами, которые принимают либо A
, либо B
в качестве аргументов:
public interface A {
void invoke(String arg);
}
public abstract class B {
public abstract void invoke(String arg);
}
public class C {
public void apply(A x) { }
public B apply(B x) { return x; }
}
Затем я могу передать лямбда в c.apply
и правильно разрешен c.apply(A)
.
C c = new C();
c.apply(x -> System.out.println(x));
Но когда я изменяю перегрузку, которая принимает B
в качестве аргумента в общую версию, компилятор сообщает, что две перегрузки неоднозначны.
public class C {
public void apply(A x) { }
public <T extends B> T apply(T x) { return x; }
}
Я думал, что компилятор увидит, что T
должен быть подклассом B
, который не является функциональным интерфейсом. Почему он не может решить правильный метод?