Изменения в доступе к переменным для универсальных классов в Java 7

Вот простой пример кода, который компилируется с использованием Java 6, но не компилируется в 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;
    }
  }
}

В Java 7 он не компилируется в метод get(TestContainer container)с ошибкой:

ошибка: _myVar имеет частный доступ в тесте

Я не понимаю, почему это больше не компилируется — по-моему, должно. Переменная tимеет тип T, который должен расширять Test. Он пытается получить доступ к полю _myVarэкземпляра Testиз класса Test.

Действительно, если я изменю метод get(TestContainer container)на следующий, он компилируется (без предупреждений):

public int get(TestContainer<T> container){
  Test t = container.get();
  return t._myVar;
}
  • Почему это больше не компилируется?
  • Было ли это ошибкой в ​​Java 6? Если да, то почему?
  • Является ли это ошибкой в ​​Java 7?

Я погуглил и поискал в базе данных ошибок Oracle, но ничего не нашел по этому поводу...

17
задан amaidment 28 May 2012 в 10:10
поделиться