2009-04-16 29 views
7

Ai là đúng? Eclipse hoặc javac?Lỗi trong trình biên dịch eclipse hoặc javac?

--------------- c/v/A.java ---------------

package c.v; 
public class A<T> { 
} 

- ------------- c/v/B.java ---------------

package c.v; 
public class B extends A<B.Secret> { 
    private class Secret {}; 
} 

Eclipse biên dịch B.java tốt.

Javac gặp sự cố.

$ javac c/v/B.java 
c/v/B.java:3: c.v.B.Secret has private access in c.v.B 
public class B extends A<B.Secret> { 
         ^
    1 error 

Trả lời

7

Các bộ phận có liên quan của Java Language Specification phải:

§8.1.4: [... ] ClassType phải đặt tên một loại lớp có thể truy cập (§6.6) hoặc xảy ra lỗi biên dịch.

§6.6.1: [...] Một thành viên (lớp, giao diện, trường hoặc phương pháp) của loại tham chiếu (lớp, giao diện hoặc mảng) hoặc một hàm tạo kiểu lớp chỉ có thể truy cập nếu loại này có thể truy cập được và thành viên hoặc nhà xây dựng được khai báo để cho phép truy cập:

  • Nếu thành viên hoặc nhà xây dựng được công khai, thì truy cập được phép. Tất cả các thành viên của giao diện được ngầm công khai. [...]
    • Nếu không, nếu thành viên hoặc người xây dựng được khai báo riêng, thì quyền truy cập được phép khi và chỉ khi nó xảy ra trong cơ thể của cấp cao nhất (§7.6) bao quanh tuyên bố thành viên hoặc nhà xây dựng.

Vì vậy, kể từ khi ClassType không nằm trong cơ thể của lớp, B.Secret không thể truy cập tại địa điểm này, vì vậy A<B.Secret> không accesible, do đó, một lỗi thời gian biên dịch sẽ xảy ra.

+0

Tôi nghĩ câu trả lời này là chính xác mặc dù giới hạn đối với nội dung của lớp cấp cao nhất của JLS là ngớ ngẩn. Truy cập OUGHT để mở rộng đến khai báo lớp (và cụ thể là các tham số kiểu) của lớp mức cao nhất. – Eric

3

tôi sẽ có xu hướng nghĩ javac là đúng. Để tạo một lớp học mới

A<B.Secret> 

chung cần có quyền truy cập vào lớp mà nó sử dụng. Thực tế là B sau đó mở rộng lớp đó là nhỏ.

6

Eclipse sai. Nếu bạn quảng cáo một cái gì đó như

extends A<X> 

bạn cần cả hai để biết về A, và X.

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