[英]Enum Inner Class is not recognized as Enum
考慮以下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。
具體來說,我正在嘗試可靠地測試對象是否為枚舉:
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<?> m = APlanet.MARS;
來自JLS Section 8.9.1 - Enum Constants :
枚舉常量的可選類體隱式定義了一個匿名類聲明(第15.9.5節),該聲明擴展了直接封閉的枚舉類型。 班級團體由匿名班級的通常規則管理; 特別是它不能包含任何構造函數。
您已在第一個枚舉中聲明了特定於常量的類主體:
MARS () {public void stuff(){}}; // The curly braces defines a class body
這會創建一個匿名類。 因此, MARS.getClass()
將返回此匿名類的Class實例,該實例不是Enum
。
這類似於您創建接口的匿名子類的實例,或者像這樣的任何其他類的情況:
SomeInterface obj = new SomeInterface() { /** Method definitions **/ };
然后obj.getClass()
不會返回SomeInterface
但是ClassContainingThatDeclaration$1
。
請注意,
APlanet.getDeclaringClass().isEnum()
正確返回true
我懷疑應該是 - APlanet.MARS.getDeclaringClass().isEnum()
。 根據Enum#getDeclaringClass()
方法的文檔,這將返回true:
返回與此枚舉常量的枚舉類型對應的Class對象。 當且僅當
e1.getDeclaringClass() == e2.getDeclaringClass()
兩個枚舉常量e1和e2具有相同的枚舉類型。 (此方法返回的值可能與Object.getClass()
方法返回的值不同,對於具有常量特定類主體的枚舉常量。)
現在可以想到的一個問題是, enum
不能被分類。 那么,如何創建枚舉的匿名子類? 它如何擴展enum
? 這是因為,枚舉是最終的,除非它聲明一些常量特定的類體,按照JLS第8.9節 - 枚舉 :
枚舉類型是隱式final的,除非它包含至少一個具有類主體的枚舉常量。
enum
: 即使特定於常量的類體隱式創建了一個匿名子類,也無法顯式擴展enum
。 根據JLS第8.1.4節 - 超類和子類 :
如果ClassType命名類Enum或對其進行任何調用,則為編譯時錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.