2013-02-12 73 views
9

Tôi vừa gặp một hành vi mà trước tiên tôi nghĩ đó là một lỗi trong Eclipse. Xem xét lớp đơn giản này:Tại sao lớp của tôi không thể triển khai giao diện được khai báo bên trong?

public class Foo { 
    public static interface Callback { 
     public void onAction(); 
    } 
} 

Điều này hoàn toàn hợp lệ. Tuy nhiên, đây không phải là:

public class Foo implements Callback { 
    public static interface Callback { 
     public void onAction(); 
    } 

    public void onAction() { /*some implementation*/ } 
} 

Nhưng điều này là hợp lệ, quá:

public class Foo { 
    public static interface Callback { 
     public void onAction(); 
    } 

    private final Callback mCallback = new Callback() { 
     public void onAction() { /*some implementation*/ } 
    }; 
} 

Tại sao Java buộc tôi phải loại 'chất thải' thành viên cho nó, nếu nó chỉ đơn giản có thể lưu nó bằng cách cho phép tôi thực hiện điều này? Tôi nhận thức được 'cách giải quyết' để đưa giao diện này vào trong tệp riêng của nó, nhưng không tò mò: Có lý do nào khiến nó không hoạt động?

+0

AFAIK, bạn không thể làm mới trên giao diện, do đó, gọi lại mới() không hợp lệ –

+2

Tôi không chắc chắn lý do chính thức cho việc này không hoạt động, nhưng tôi không thấy lý do nào bạn muốn một lớp thực hiện một giao diện mà nó chứa - tại sao bạn không chỉ định nghĩa lớp với các phương thức mà bạn đang cố gắng đưa vào giao diện? Tại sao bạn lại muốn có một giao diện trong trường hợp này? – iamnotmaynard

+2

@MiguelPrz, anh ấy đang tạo một triển khai thực hiện giao diện nội tuyến bằng cách sử dụng '{}' – Miquel

Trả lời

6

Trong trường hợp thứ 2 của bạn, vì chữ ký được kiểm tra trước phần thân của lớp, khi trình biên dịch cố gắng biên dịch lớp Foo, giao diện Callback chưa được xác định.

8

Sử dụng mã này

public class Foo implements Callback{ 

public static interface Callback{ 
    public void onAction() 
} 

public void onAction(){//some implementation} 
} 

là những gì Callback? Trình biên dịch (btw khác với Eclipse,) không biết Callback là gì.

Bạn đã xác định giao diện Callback sau khi đã sử dụng.

+1

không thể trình biên dịch nhìn về phía trước và nhận được một danh sách của tất cả các lớp học đến? cảm thấy ngớ ngẩn – NikkyD

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