Поле с параметрами типа универсального класса становится невидимым после обновления до Java 7

Теперь 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 привело к тому, что поля с параметризацией типа стали невидимыми?

44
задан BalusC 11 October 2011 в 01:34
поделиться