Java8: ambiguità con lambda e metodi sovraccaricati

Sto giocando con java8 lambda e mi sono imbattuto in un errore del compilatore che non mi aspettavo.

Diciamo che ho un’interfaccia funzionale interface A , una abstract class B e una class C con metodi sovraccaricati che accettano A o B come argomenti:

 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; } } 

Quindi posso passare una lambda in c.apply ed è correttamente risolta in c.apply(A) .

 C c = new C(); c.apply(x -> System.out.println(x)); 

Ma quando cambio il sovraccarico che porta B come argomento ad una versione generica il compilatore riporta che i due sovraccarichi sono ambigui.

 public class C { public void apply(A x) { } public  T apply(T x) { return x; } } 

Pensavo che il compilatore avrebbe visto che T doveva essere una sottoclass di B che non è un’interfaccia funzionale. Perché non può risolvere il metodo corretto?