13

可能重复:
泛型类的类型参数化字段在升级到 Java 7 后变得不可见

public class Test{

    private String _canYouSeeMe = "yes";

    <T extends Test> void genericMethod(T hey){
        String s = hey._canYouSeeMe;
    }

    void method(Test hey){
        String s = hey._canYouSeeMe;
    }   
}

在针对 JDK 1.6 构建时,它编译得很好,但是针对 1.7,genericMethod() 中存在编译器错误:字段 Test._canYouSeeMe 不可见

可以通过使 _canYouSeeMe 受保护而不是私有来解决该错误,但我只是想知道从 1.6 到 1.7 发生了什么变化

4

2 回答 2

8

子类(T)类 ( Test)永远无法访问超类的私有字段。这可能是 Java 6 编译器中的一个错误,已在 Java 7 中修复。

请记住:T extends Test表示它T是 的子类Test。这并不意味着'T类是Test.class,这是拥有私有字段和方法访问的必要条件。

于 2012-08-01T14:31:52.180 回答
1

回复@Joachim - 评论太长了。

这与无法编译的事实一致:

void method(SubTest hey) {
    String s = hey._canYouSeeMe;
}

(其中 SubTest 扩展了 Test)而这将编译

void method(SubTest hey) {
    String s = ((Test) hey)._canYouSeeMe;
}
于 2012-08-01T14:42:03.237 回答