Oto prosty przykład z jakiegoś kodu, który kompiluje używając Java 6, ale nie skompilować w Javie 7.Zmiany w dostępie do zmiennych klas rodzajowych w Javie 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;
}
}
}
W Javie 7, to nie kompilacji w metodzie get(TestContainer<T> container)
, z błędem:
error: _myVar has private access in Test
ja nie rozumiem, dlaczego to nie kompiluje - w moim umyśle powinien. Zmienna t
jest typu T
, która musi rozciągać się na Test
. Próbuje uzyskać dostęp do pola _myVar
instancji Test
z klasy Test
.
Rzeczywiście, jeśli mogę zmienić metodę get(TestContainer<T> container)
do dalszej kompiluje (bez ostrzeżenia):
public int get(TestContainer<T> container){
Test t = container.get();
return t._myVar;
}
- Dlaczego to nie skompilować?
- Czy to błąd w Java 6? Jeśli tak, dlaczego?
- Czy to błąd w Java 7? Komentarz
miałem google i wyszukuje w bazie danych Oracle błędów, ale nie znalazłem nic na ten temat ...
To był błąd w Javie 6: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022052 – pingw33n
@ pingw33n, należy zakładać, że jako odpowiedź. –
@ pingw33n, a następnie mogę go zaakceptować ... chociaż jeśli ktoś, kto lepiej zrozumie JLS, może wyjaśnić sekcję "Ocena" w raporcie o błędzie, również bym to docenił. – amaidment