升级到Java 7后,泛型类的类型参数化字段不可见

升级到Java 7后,泛型类的类型参数化字段不可见,java,generics,visibility,java-7,Java,Generics,Visibility,Java 7,现在,内置支持在一两周后终于推出了,我正在将我的游乐场项目从Helios SR2+JDK 1.623迁移到Indigo SR1+JDK 1.7.0。在完全重建所有项目后,只有一个类未能编译。下面的类在Java 1.6(和1.5)上编译并运行得非常好: 公共抽象类区域,但我找不到任何类似的报告 修复编译错误的另一种方法是将类中所有已使用的A声明替换为Area(或将其全部删除): 公共抽象类区域>{ 私有字符串名称; 私人区域家长; 私有集>(); 用于(面积:面积){ area.parent=这个

现在,内置支持在一两周后终于推出了,我正在将我的游乐场项目从Helios SR2+JDK 1.623迁移到Indigo SR1+JDK 1.7.0。在完全重建所有项目后,只有一个类未能编译。下面的类在Java 1.6(和1.5)上编译并运行得非常好:

公共抽象类区域,但我找不到任何类似的报告

修复编译错误的另一种方法是将类中所有已使用的
A
声明替换为
Area
(或将其全部删除):

公共抽象类区域>{
私有字符串名称;
私人区域家长;
私有集>();
用于(面积:面积){
area.parent=这个;
此.areas.add(区域);
}
}

publicset这似乎是一个javac6错误,在javac7中已修复

解决方法是通过向上转换:

((Area<?>)area).parent = this;
((区域)区域)。父项=此项;
这看起来真的很奇怪-为什么我们需要一个向上的演员来访问超级班的成员

根本问题是,私有成员被明确排除在继承之外,因此
A
没有
parent
成员。同样的问题可以通过一个非通用的例子来说明

错误消息“parent在区域中具有私有访问权限”并不十分准确,但在大多数情况下可能没有问题。然而,在这种情况下,这是一种误导,更好的信息应该是“a不从区域继承私有成员‘parent’”


为了便于调查,让我们根据JLS对您的示例进行全面分析:

  • §4.4:类型变量
    X
    的成员,其界限
    T&I1。。。在
    中,是交叉口类型(§4.9)
    T&I1的成员。。。在
    中,出现在声明类型变量的点处

  • §4.9:交叉点类型与类类型(§8)具有相同的成员,具有空主体、直接超类
    Ck
    和直接超接口
    IT1,…,ITn,
    ,在交叉点类型出现的相同包中声明

  • §6.6.1:如果成员或构造函数被声明为私有,则只有当且仅当访问发生在包含成员或构造函数声明的顶级类(§7.6)主体内时,才允许访问

  • §8.2:声明为私有的类的成员不会被该类的子类继承

  • §8.5:类从其直接超类和直接超接口继承超类和超接口的所有非私有成员类型,这些成员类型都可由类中的代码访问,且不被类中的声明隐藏


不应该这样,但是将ctor从
受保护
更改为
公共
重要吗?@DaveNewton:不,不重要。有趣。谢谢你的指点。有没有确认javac6错误的已知错误报告?我不知道。在我看来,javac7改进了很多东西;他们可能彻底检查了整个类型系统代码,因为javac6太乱了,无法修复。在这种情况下,他们不可能有完整的javac6错误列表。
((Area<?>)area).parent = this;