簡體   English   中英

枚舉內部類不被識別為枚舉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM