Testuję nowe funkcje zamykania Java 8; Zastanawiam się, dlaczego ten kawałek koduZamknięcia Java 8 i rozpoznawanie typów
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(); }
}
daje błąd: both method z(IFA) in Test8 and method z(IFB) in Test8 match error
w systemie z wezwaniem w metodzie run
nie jest kompilator stanie wykryć, że forceA
inwokacja zmusza x być typu A, a zatem prawidłowe użycie to z(IFA fun)
?
(podobna funkcja jest legalne w C# przy użyciu delegata; czy istnieje sposób, aby uzyskać ten sam rezultat w Java 8?)
Jeśli to nie zostanie skompilowane, kompilator wyraźnie nie jest wystarczająco inteligentny, aby to zrozumieć. –