Сейчас Eclipse Indigo SR1 со встроенной поддержкой Java 7 наконец-то вышел через неделю или две, я перевожу свои игровые проекты с Helios SR2 + JDK 1.6_23 на Indigo SR1+ JDK 1.7.0.После полной перестройки всех проектов не удалось скомпилировать только один класс.Это следующий класс, который прекрасно компилируется и работает на Java 1.6 (и 1.5):
public abstract class Area<A extends Area<?>> implements Comparable<Area<?>> {
private String name;
private Area<?> parent;
private Set<A> areas;
protected Area(String name, A... areas) {
this.name = name;
this.areas = new TreeSet<A>();
for (A area : areas) {
area.parent = this;
this.areas.add(area);
}
}
public Set<A> getAreas() {
return areas;
}
// ...
}
Строка area.parent = this;
завершается ошибкой со следующей ошибкой parent
:
Площадь поля.parent не виден
После первого подозрения на компилятор Eclipse, я попытался с обычным javac
из JDK 1.7.0, но он дает в основном ту же ошибку, тогда как javac
из JDK 1.6.0_23 успешно без ошибок.
Изменение видимости на protected
или по умолчанию решает проблему.Но почему полностью вне меня.Я заглянул на http://bugs.sun.com,, но не смог найти ничего похожего.
Другой способ исправить ошибку компиляции - заменить все используемые A
объявления внутри класса на Area<?>
(или полностью удалить его):
public abstract class Area<A extends Area<?>> implements Comparable<Area<?>> {
private String name;
private Area<?> parent;
private Set<Area<?>> areas;
protected Area(String name, Area<?>... areas) {
this.name = name;
this.areas = new TreeSet<Area<?>>();
for (Area<?> area : areas) {
area.parent = this;
this.areas.add(area);
}
}
public Set<Area<?>> getAreas() {
return areas;
}
// ...
}
Но это ломаетцель добытчика.В случае, например, следующего класса:
public class Country extends Area<City> {
public Country(String name, City... cities) {
super(name, cities);
}
}
Я ожидаю, что он вернет Set<City>
, а не Set<Area<?>>
.
Какое изменение в Java 7 вызвало тепараметризованные поля станут невидимыми?