为什么参数的私有字段在 Java 6 中对泛型方法可见,但在 Java 7 中却不可见?

可能的重复:
泛型类的类型参数化字段在升级到 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发生了什么变化


答案 1

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

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


答案 2

回复@Joachim - 评论太长。

这与这样一个事实是一致的,即这不会编译:

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

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

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