Теперь 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
:
Поле Area < capture # 1-of? > . 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 привело к тому, что поля, параметризованные по типу, стали невидимыми?