Mudanças no acesso de variáveis para classes genéricas no Java 7
Aqui está um exemplo simples de algum código que compila usando o Java 6, mas não compila no 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;
}
}
}
No Java 7, ele falha em compilar noget(TestContainer<T> container)
método, com o erro:
erro: _myVar tem acesso privado no teste
Eu não entendo porque isso não compila mais - na minha cabeça deveria. A variávelt
é do tipoT
, que deve estenderTest
. Está tentando acessar o campo_myVar
de uma instância deTest
de dentro da classeTest
.
De fato, se eu mudar o métodoget(TestContainer<T> container)
para o seguinte, compila (sem avisos):
public int get(TestContainer<T> container){
Test t = container.get();
return t._myVar;
}
Por que isso não compila mais?Isso foi um bug no Java 6? Se sim porque?Isso é um bug no Java 7?Eu tive um google e procurei no banco de dados de bugs do Oracle, mas não encontrei nada sobre isso ...