Почему частное поле параметра видимо для общего метода в 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
Ответы
Ответ 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;
}