2012-08-27 17 views
15

Các biến thành viên công khai trong giao diện Java 8 có phải là một tính năng hoặc một hiệu ứng phụ/lỗi thực hiện không?Biến số thành viên giao diện Java 8 (trước khi phát hành)

Câu hỏi này liên quan đến bản phát hành Java 8 được phát hành trước lambda-8-b50-linux-x64-26_jul_2012.tar.gz.

Java 8 giới thiệu các tính năng mới cho giao diện dưới dạng các phương pháp mặc định. thử nghiệm ngẫu nhiên với trình biên dịch lambda JDK8 cho phép giao diện của mẫu này:

public interface Foo { 
    public int foo = 0; 
    int foo() default { return foo; } 
} 

mẫu triển khai loại:

public class FooImpl implements Foo { 
    public int foo = 1; 
} 

Mã này tuân theo quy chuẩn cho shadowing biến:

Foo f = new FooImpl(); 
System.out.println(f.foo()); 
System.out.println(f.foo); 
System.out.println(new FooImpl().foo); 

Output:

0 
0 
1 

Tài liệu (JSR 335: Biểu thức Lambda cho Ngôn ngữ lập trình Java ™ phiên bản 0.5.1) không đề cập đến các biến thành viên. Tôi nghiêng để nghĩ rằng trình biên dịch là quá khoan dung nhưng có lẽ tôi đã bỏ lỡ một cái gì đó.

Trả lời

27

Các trường công khai trong giao diện không phải là một tính năng mới trong Java 8. Nếu bạn nhớ rằng chúng hoàn toàn tĩnh và cuối cùng, kết quả bạn đang thấy có ý nghĩa hoàn hảo.

+2

Để kiểm tra, hãy thử 'Foo.foo = 0; ' – oldrinb

+4

+1 - Và chúng tôi có thể thêm rằng Java 8 không thể thay đổi trường giao diện công khai thành không tĩnh và/hoặc không cuối cùng mà không vi phạm nhiều mã hiện tại nhiều cách khác nhau. –

+2

Doh! Bạn là chính xác - Tôi vừa tuyên bố họ là cuối cùng tĩnh trong 15 năm qua. Đây là phần liên quan của JLS: [9.3. Tuyên bố trường (Hằng số)] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.3). – McDowell

Các vấn đề liên quan