次の Enum クラスを検討してください。
public enum APlanet {
VENUS () {public void stuff(){}},
EARTH () {public void stuff(){}},
MARS () {public void stuff(){}};
public abstract void stuff();
}
public enum BPlanet {
VENUS (),
EARTH (),
MARS ();
}
その後APlanet.MARS.getClass().isEnum()
、false をBPlanet.MARS.getClass().isEnum()
返しますが、true を返します。なんで?APlanet.getDeclaringClass().isEnum()
が正しく true を返すことに注意してください。
具体的には、オブジェクトが Enum であるかどうかを確実にテストしようとしています。
Object a = APlanet.MARS;
Object b = BPlanet.MARS;
a.getClass().isEnum() /* returns false */
b.getClass().isEnum() /* returns true */
まだ
Enum.class.isAssignableFrom(a.getClass()); /* returns true */
内部クラス APlanet.MARS が Enum ではないのに、次のように Enum に割り当てることができるのは少し混乱します。
Enum<?> m = APlanet.MARS;