2012-03-07 22 views
11

Eclipse chàm, java 1,6Eclipse yêu nó, javac ghét nó, nó là một enum, loại, với một giao diện

public interface I { 
    String getName(); 
} 

/* and in another file */ 

public enum E implements I { 
    E1() { 
    String getName() { return "foo"; } 
    }; 
} 

Trong Eclipse, điều này làm việc! Các lớp khác có thể gọi getName() trên các tham chiếu của kiểu I. javac thực sự đã từ chối nó, tuyên bố rằng không có điều nào như getName() trong enum. Đây có phải chỉ là lỗi của Eclipse không?

Lưu ý rằng điều đáng lo ngại về điều này là định nghĩa phương thức bên trong điều tra số. Tất cả đều hoạt động tốt trong cả Eclipse và Javac nếu tôi làm điều bình thường, và có hàm được định nghĩa ở dưới cùng của enum trả về giá trị của một trường.

+1

Nó phải được cho phép. Câu hỏi này có liên quan: http://stackoverflow.com/questions/2709593/why-would-an-enum-implement-an-interface Bạn đang nhận được lỗi 'javac' nào? –

+0

+1 cho tiêu đề. :-) –

+2

Cũng liên quan đến http://stackoverflow.com/questions/9505857/workaround-for-javac-compilation-order-bug-in-maven – Nicocube

Trả lời

1

Trước tiên, tôi đồng ý với @yshavit.

Nếu không nó có thể liên quan với cái này: Workaround for javac compilation order bug in maven

Tôi nghĩ đó là tên đơn hàng liên quan. Hãy thử đổi tên giao diện của bạn A, nó có thể biên dịch đầu tiên và mọi thứ sẽ hoạt động.

12

getName() trong E1 phải là public - đó có phải là nguyên nhân gây ra sự cố không? Nếu không, bạn đang cố gắng ghi đè lên một phương thức công khai (tất cả các phương thức được khai báo trong giao diện là công khai) với một phương thức gói riêng tư, không được phép.

1

Phương thức giao diện là công khai phạm vi. Tăng mức hiển thị trong enum của bạn và nó sẽ biên dịch thành công. Một lưu ý phụ, mã của bạn cho thấy một lỗi biên dịch trong phiên bản Eclipse của tôi (Indigo chạy trên Mac 0S X 10.7.2, JDK 1.6).

0

Hãy nhớ rằng Eclipse thực hiện trình phân tích cú pháp và trình biên dịch riêng của mình, cung cấp đầu ra liên kết chặt chẽ với trình soạn thảo của nó. Thông thường, nó hoạt động rất tốt; tuy nhiên, khi một tính năng ngôn ngữ mới đi vào hoạt động, trình biên dịch có xu hướng tụt lại phía sau khi triển khai tính năng ngôn ngữ mới.

Dòng lệnh javac (rất gần) luôn đúng, giả sử bạn đang nhận được javac từ Oracle/SUN.

Câu trả lời của yshavit là tốt nhất, vì nó xác định lý do tại sao nó không được biên dịch trong Eclipse. Bởi bây giờ tôi tưởng tượng nó đã được sửa chữa (và đúng cách sẽ không biên dịch trong Eclipse).

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