Sto testando le nuove funzionalità di chiusura di Java 8; Mi chiedo perché questo pezzo di codiceJava 8 chiusure e riconoscimento del tipo
public class Test8 {
private class A { int a;}
private class B { int b;}
interface IFA { void ifa(A param); }
interface IFB { void ifb(B param); }
private void forceA(A expr) { }
private void z(IFA fun) { System.out.println("A"); fun.ifa(new A()); }
private void z(IFB fun) { System.out.println("B"); fun.ifb(new B()); }
public void run() {
z(x -> forceA(x));
}
public static void main(String args[]) { new Test8().run(); }
}
dà l'errore: both method z(IFA) in Test8 and method z(IFB) in Test8 match error
su z invocazione del metodo run
non è il compilatore in grado di rilevare che i forceA
invocazione forze x essere di tipo A e quindi la corretta z da usare è z(IFA fun)
?
(una funzione simile è legale in C# utilizzando delegato; c'è un modo per ottenere lo stesso risultato in Java 8?)
Se questo non viene compilato, il compilatore chiaramente non è abbastanza intelligente da capirlo. –