泛型类的类型参数化字段在升级到 Java 7 后变得不可见
现在,具有内置Java 7支持的Eclipse Indigo SR1终于在一两周内发布,我正在将我的游乐场项目从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
字段区域<捕获 #1-of ?>.parent 不可见
在第一次怀疑Eclipse编译器之后,我尝试了JDK 1.7.0的plain,但它给出了基本相同的错误,而来自JDK 1.6.0_23的成功没有错误。javac
javac
将可见性更改为或默认值可解决问题。但为什么完全超出了我的范围。我偷看了 http://bugs.sun.com,但我找不到任何类似的报告。protected
修复编译错误的另一种方法是将类内所有使用的声明替换为(或完全删除它):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 中的哪些更改导致这些类型参数化字段变得不可见?