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