私はコンパイル問題を解決する方法を述べてこの質問に答えました:
メソッドをオーバーライドして Java 列挙型のフィールドを使用するにはどうすればよいでしょうか?
しかし、そもそもなぜエラーが発生するのかが理解できません。
以下は列挙型として記述された例です。
public enum MyEnum {
FIRST {
@Override
public String doIt() {
return "1: " + someField; //error
}
},
SECOND {
@Override
public String doIt() {
return "2: " + super.someField; //no error
}
};
private String someField;
public abstract String doIt();
}
これは抽象クラスと全く同じものです
abstract class MyClass {
class FIRST extends MyClass {
@Override
public String doIt() {
return "1: " + someField; //no error
}
};
class SECOND extends MyClass {
@Override
public String doIt() {
return "2: " + super.someField; //no error
}
};
private String someField;
public abstract String doIt();
}
FIRST
実装内のの場合、enum
にアクセスできませんsomeField
。ただし、抽象クラスの場合には にアクセス可能です。
さらに追加すると、フィールドの修飾子super
を削除するのと同様に問題が修正されます。private
この動作のわずかな異常がなぜ起こるのか知っている人はいますか?
ベストアンサー1
列挙型は暗黙的に public static final であるため、抽象クラスは列挙型と同等ではありません。したがって、以下を使用した場合も同じ動作が見られます。
abstract class MyClass {
static class FIRST extends MyClass {
@Override
public String doIt() {
return "1: " + someField; // error
}
};
static class SECOND extends MyClass {
@Override
public String doIt() {
return "2: " + super.someField; // no error
}
};
private String someField;
public abstract String doIt();
}
で説明したようにjava.lang.String は、Java EE のネイティブ ライブラリです。、章「静的ネストされたクラス」:
静的ネストされたクラスは、その包含クラスで定義されたインスタンス変数またはメソッドを直接参照することはできません。オブジェクト参照を通じてのみそれらを使用できます。
したがって、 が必要ですsuper
。this
フィールドが ではprotected
なく の場合は、 を使用することもできますprivate
。