7

誰が正しいですか?Eclipseまたはjavac?

--------------- c / v / A.java ---------------

package c.v;
public class A<T> {
}

--------------- c / v / B.java ---------------

package c.v;
public class B extends A<B.Secret> {
  private class Secret {};
}

EclipseはB.javaを問題なくコンパイルします。

Javacに問題があります。

$ javac c / v / B.java
c / v / B.java:3:cvBSecretはcvBでプライベートアクセスを持っています
パブリッククラスBはA<B.Secret>{を拡張します
                           ^
    1エラー
4

3 に答える 3

7

Java 言語仕様の関連部分は次のとおりです。

§8.1.4: [...] ClassType は、アクセス可能な (§6.6) クラス型を指定する必要があります。そうしないと、コンパイル時エラーが発生します。

§6.6.1: [...] 参照 (クラス、インターフェイス、または配列) 型のメンバー (クラス、インターフェイス、フィールド、またはメソッド) またはクラス型のコンストラクターは、型がアクセス可能であり、メンバーまたはコンストラクターは、アクセスを許可するように宣言されています。

  • メンバーまたはコンストラクターが public と宣言されている場合、アクセスが許可されます。インターフェイスのすべてのメンバーは暗黙的にパブリックです。[...]
    • それ以外の場合、メンバーまたはコンストラクターがプライベートと宣言されている場合、メンバーまたはコンストラクターの宣言を囲む最上位クラス (§7.6) の本体内で発生した場合にのみ、アクセスが許可されます。

したがって、 ClassType はクラスの本体内にないB.Secretため、この場所ではアクセスできず、アクセスできA<B.Secret>ないため、コンパイル時エラーが発生するはずです。

于 2009-04-16T19:38:05.253 に答える
6

Eclipseは間違っています。あなたが何かを宣伝するなら

extends A<X>

AとXの両方を知っている必要があります。

于 2009-04-16T19:20:36.933 に答える
3

javacは正しいと思う傾向があります。新しいクラスを作成するには

A<B.Secret>

ジェネリックは、使用するクラスにアクセスできる必要があります。Bがそのクラスを拡張するという事実はマイナーです。

于 2009-04-16T19:20:20.477 に答える