Подтвердить что ты не робот

Почему частное поле параметра видимо для общего метода в Java 6, но не в Java 7?

Возможный дубликат:
Поле с параметрами типа универсального класса становится невидимым после перехода на Java 7

public class Test{

    private String _canYouSeeMe = "yes";

    <T extends Test> void genericMethod(T hey){
        String s = hey._canYouSeeMe;
    }

    void method(Test hey){
        String s = hey._canYouSeeMe;
    }   
}

При создании против JDK 1.6 это компилируется просто отлично, но против 1.7 существует ошибка компилятора в genericMethod(): Поле Test._canYouSeeMe не отображается

Ошибка может быть решена путем создания _canYouSeeMe защищенного, а не частного, но мне просто интересно, что изменилось с 1,6 до 1,7

4b9b3361

Ответ 1

Подклассы (T) класса (Test) никогда не имеют доступа к закрытым полям суперкласса. Вероятно, это была ошибка в компиляторе Java 6, который был исправлен на Java 7.

Помните: T extends Test означает, что T является подклассом Test. Это не означает, что T class Test.class, что является необходимым условием для доступа к частному полю и методу.

Ответ 2

В ответ на @Joachim - слишком долго для комментария.

Это согласуется с тем, что это не скомпилировалось:

void method(SubTest hey) {
    String s = hey._canYouSeeMe;
}

(где SubTest extends Test), тогда как это будет компилировать

void method(SubTest hey) {
    String s = ((Test) hey)._canYouSeeMe;
}