Компилятор eclipse отказывается компилировать следующий код, заявляя, что поле s не видно. (Компилятор IBM Aspect J также отказывается, заявляя, что «не может быть разрешен») Почему это так?
public class Test {
String s;
void foo(Object o) {
String os = getClass().cast(o).s;
}
}
Спецификация языка Java гласит:
В противном случае мы говорим, что по умолчанию
доступ, который разрешен только тогда, когда
доступ происходит изнутри
пакет, в котором объявлен тип.
Как я понимаю, поле объявляется и доступно в одном и том же модуле компиляции, то есть в одном пакете, и поэтому должно быть доступно.
Еще более странно, добавление downcast с ? extends Test
до Test
делает поле видимым, то есть компилируется следующий код:
public class Test {
String s;
void foo(Object o) {
Test t = getClass().cast(o);
String os = t.s;
}
}
Я наткнулся на ошибку компилятора или неправильно понял спецификацию Java?
Edit:
Я сейчас на другом компьютере. Здесь javac принимает код, но затмение все еще не делает. Версии на этой машине:
Eclipse Platform
Версия: 3.4.2 ID сборки:
M20090211-1700
JDK 1.6.0
Редактировать 2
Действительно, Javac принимает код. Я проверил, запустив сборку ant, в которой используется компилятор IBM Ascpect J ...