2012-08-01 9 views
12

可能性の重複:
Type-parameterized field of a generic class becomes invisible after upgrading to Java 7パラメータ6のプライベートフィールドがJava 6ではジェネリックメソッドには表示されますが、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でコンパイルエラー()があります: フィールドテスト。 _canYouSeeMeが表示されない

エラーは、_canYouSeeMeをむしろ保護することで解決できます民間よりも、私はちょうどクラスの1.7

+2

エラーまたは警告をコンパイルすることになるのに対し、(サブテストは、テストを拡張する場合)

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

? – kosa

+0

なぜですか?これは同じクラスのメソッドですね。非静的でもあります。 – Qnan

+0

@fmucarここでopenjdk 1.6.0_24でうまくコンパイルされました。 –

答えて

7

サブクラス(T)に1.6から変更されたものを思ったんだけど(Testは、スーパークラスのprivateフィールドへのアクセス権を持っていることはありません。これは、Java 7で修正されたJava 6コンパイラのバグであった可能性があります。

覚えておいてください:TTestのサブクラスです。 ではないTのクラスがTest.classであり、プライベートフィールド&メソッドへのアクセスに必要な条件であることを意味します。

+0

これは部分的には真ですが、プライベートフィールドにアクセスするコードはスーパークラスそのものにあるので、アクセスが必要です。 – Qnan

+2

@Matt:私はそれを取得しません。もしそれが本当であれば、 'ちょっと' 'テストする'(それはまったく正当なもので、警告を生成しない)なぜ '_canYouSeeMe'にアクセスするのでしょうか? –

+0

+1 Java 6のバグの数は、互換性の問題を避けるためにJava 7まで修正されていませんでした。 –

1

@Joachimに返信しています - コメントが長すぎます。

それは、これがコンパイルされないという事実と一致している:これは

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

2番目の例では、 'SubTest'が最上位クラスであるときに(Java 6と7の両方で)コンパイルされません。 –

+0

@MattBall:どうしてですか? 'SubTest'が' Test'を拡張している限りです。それは私のためにコンパイルされます。 –

+0

@MattBall 'method'がTestのメンバである場合、' SubTest'がトップレベルのクラスであってもコンパイルします。 – assylias

関連する問題