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

met*_*eta 13 java generics private-members generic-method 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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*all 8

(T)class(Test)的子类永远不能访问超类的私有字段.这可能是Java 7中修复的Java 6编译器中的错误.

记住:T extends Test意味着它T是的子类Test.它并不意味着T的课Test.class,这对于具有私有字段和方法接入的必要条件.

  • @Matt:我不明白.如果这是真的,那么为什么将'hey`转换为`Test`(这是完全合法的,甚至不产生警告)让我们访问`_canYouSeeMe`? (2认同)
  • @JoachimSauer因为在给定的`Test`子类型中添加一个名为`_canYouSeeMe`的字段会改变字段访问表达式以引用新字段.在这种情况下,在给定类型是类型变量的情况下,降低类型变量的上限可以类似地改变含义.那些虫子会在完全沉默中爬上我们.我欢迎特别的门被关闭. (2认同)