Hier ist ein einfaches Beispiel für einige Code, Java 6 mit kompiliert, aber nicht kompiliert in Java 7.Änderungen der Zugriff von Variablen für generische Klassen in 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;
}
}
}
In Java 7, scheitert es an kompilieren im get(TestContainer<T> container)
Verfahren, mit dem Fehler:
error: _myVar has private access in Test
ich verstehe nicht, warum das nicht mehr kompiliert - in meinem Kopf es sollte. Die Variable t
ist vom Typ T
, die Test
muss erweitert werden. Es versucht, auf das Feld _myVar
einer Instanz Test
innerhalb der Klasse Test
zuzugreifen.
der Tat, wenn ich die Methode get(TestContainer<T> container)
der folgenden ändern, kompiliert es (ohne Warnungen):
public int get(TestContainer<T> container){
Test t = container.get();
return t._myVar;
}
- Warum funktioniert das nicht mehr kompilieren?
- War das ein Fehler in Java 6? Wenn ja warum?
- Ist das ein Fehler in Java 7?
ich eine Google und suchten in der Oracle-Bug-Datenbank gehabt haben, haben aber nichts dazu gefunden ...
Dies ist ein Fehler in Java 6 war: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022052 – pingw33n
@ pingw33n, sollten Sie schreiben, dass als Antwort. –
@ pingw33n, und dann kann ich es akzeptieren ... obwohl, wenn jemand, der ein besseres Verständnis der JLS hat, den Abschnitt "Bewertung" des Fehlerberichts erklären kann, würde ich das auch begrüßen. – amaidment