Tôi đang thử nghiệm các tính năng đóng mới của Java 8; Tôi đang tự hỏi tại sao đoạn mã nàyĐóng cửa Java 8 và nhận dạng loại
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(); }
}
cung cấp cho các lỗi: both method z(IFA) in Test8 and method z(IFB) in Test8 match error
trên gọi z trong phương pháp chạy
Không phải là trình biên dịch có thể phát hiện rằng forceA
gọi lực lượng x là các loại A và do đó z chính xác để sử dụng là z(IFA fun)
?
(một chức năng tương tự là hợp pháp trong C# sử dụng đại biểu; là có một cách để có được kết quả tương tự trong Java 8?)
Nếu điều này không biên dịch, thì trình biên dịch rõ ràng không đủ thông minh để tìm ra điều đó. –