Ecco un semplice esempio di codice che compila utilizzando Java 6, ma non viene compilato in Java 7.Le variazioni di accesso di variabili per le classi generiche 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, non riesce a compilo nel metodo get(TestContainer<T> container)
, con l'errore:
error: _myVar has private access in Test
non capisco il motivo per cui questo non è più compila - nella mia mente dovrebbe. La variabile t
è di tipo T
, che deve estendere Test
. Sta tentando di accedere al campo _myVar
di un'istanza di Test
all'interno della classe Test
.
Anzi, se cambio il metodo get(TestContainer<T> container)
al seguente, compila (senza avvisi):
public int get(TestContainer<T> container){
Test t = container.get();
return t._myVar;
}
- Perché questa compilazione non è più?
- Si trattava di un bug in Java 6? Se è così, perché?
- Si tratta di un bug in Java 7? commento
Ho avuto un google e cercare nel database dei bug di Oracle, ma non ho trovato nulla su questo ...
Questo era un bug in Java 6: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022052 – pingw33n
@ pingw33n, si dovrebbe post che come una risposta. –
@ pingw33n, e quindi posso accettarlo ... anche se chiunque abbia una migliore comprensione del JLS può spiegare la sezione "Valutazione" del bug report, lo apprezzerei anche io. – amaidment