バグをeclipseのコンパイラまたはjavac?
-
09-09-2019 - |
質問
者である。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: c.v.B.Secret has private access in c.v.B public class B extends A<B.Secret> { ^ 1 error
解決
当該部品の "Java言語仕様 必:
§8.1.4:[...]のClassType者の名前、アクセス(§6.6)クラスタイプ、またはコンパイル時にエラーが発生します。
§6.6.1:[...] 会員クラスのインタフェースやメソッドの参照(クラス、インタフェース、または配列)の型またはコンストラクタのクラスタイプだけがアクセスできるので場合にはアクセスの会員またはコンストラクタを宣言された許可アクセス:
- た場合には、速やかにこれを会員またはコンストラクタを宣言し、そのアクセス可能です。全員でのインタフェースを暗黙的に公開します。[...]
- そうではない場合、又は会員とのコンストラクタを宣言し、そのアクセスが許可されたす場合だけに生体内でのトップレベルのクラス(§7.6)を封入したこの宣言の会員またはコンストラクタです。
でインストールし、ClassTypeではない身体の中のクラス B.Secret
アクセスすることはできませんのでこの場所で A<B.Secret>
なaccesibleでコンパイル時のエラーは発生します。
他のヒント
Eclipseは間違っています。あなたに何かを宣伝する場合は、
extends A<X>
あなたはA、およびXについて知っているの両方を必要とします。
私は、javacのが正しいと思う傾向があります。新しいクラスを作成するために、
A<B.Secret>
一般的なニーズは、それが使用するクラスへのアクセス権を持っています。 Bは、クラスが未成年であることを拡張しているという事実ます。
所属していません StackOverflow