Đây là một ví dụ đơn giản của một số mã mà biên dịch sử dụng Java 6, nhưng không biên dịch trong Java 7.Những thay đổi trong việc tiếp cận các biến cho các lớp học chung trong Java 7
public class Test<T extends Test> {
private final int _myVar;
public Test(int myVar) {
_myVar = myVar;
}
public int get(TestContainer<T> container){
T t = container.get();
return t._myVar;
}
private static class TestContainer<T extends Test> {
private final T _test;
private TestContainer(T test) {
_test = test;
}
public T get(){
return _test;
}
}
}
Trong Java 7, nó không biên dịch theo phương pháp get(TestContainer<T> container)
, với lỗi:
error: _myVar has private access in Test
Tôi không hiểu tại sao điều này không còn biên dịch - theo ý tôi. Biến số t
thuộc loại T
, phải mở rộng Test
. Nó đang cố truy cập vào trường _myVar
của phiên bản Test
từ bên trong lớp Test
.
Thật vậy, nếu tôi thay đổi phương pháp get(TestContainer<T> container)
đến những điều sau đây, nó biên dịch (không có cảnh báo):
public int get(TestContainer<T> container){
Test t = container.get();
return t._myVar;
}
- Tại sao điều này không còn biên dịch?
- Đây có phải là lỗi trong Java 6 không? Nếu vậy tại sao?
- Đây có phải là lỗi trong Java 7 không? bình luận
Tôi đã có một google và tìm kiếm trong cơ sở dữ liệu lỗi Oracle, nhưng đã không tìm thấy bất cứ điều gì về vấn đề này ...
Đây là một lỗi trong Java 6: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022052 – pingw33n
@ pingw33n, bạn nên gửi đó như là một câu trả lời. –
@ pingw33n, và sau đó tôi có thể chấp nhận nó ... mặc dù nếu có ai hiểu rõ hơn về JLS có thể giải thích phần 'Đánh giá' của báo cáo lỗi, tôi cũng đánh giá cao điều đó. – amaidment