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() にコンパイラ エラーがあります: The field Test._canYouSeeMe is not visible

_canYouSeeMe を private ではなく protected にすることでエラーを解決できるのですが、1.6 から 1.7 で何が変わったのか気になります。

4

2 に答える 2

8

T)クラス ( Test)のサブクラス ( ) は、スーパークラスのプライベート フィールドにアクセスできません。これは、Java 7 で修正された Java 6 コンパイラのバグである可能性があります。

覚えておいてください:は のサブクラスであるT extends Testことを意味します。のクラスがであるという意味ではありませ。これは、プライベート フィールドとメソッドへのアクセスに必要な条件です。TTestTTest.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 に答える