2012-08-05 97 views
2

我目前工作的一個項目(數據庫實現),涉及稱爲ElementType與內枚舉枚舉類稱爲TypeType。在ElementType內部,有一個HashMap<TypeType, ArrayList<ElementType>>將所有ElementType的值映射到其對應的TypeType值。錯誤枚舉與靜態初始化

TypeType的值是ElementType(其對應TypeType和)是

[CHARACTER(TEXT), CHAR(TEXT), DECIMAL(NUMBER_EXACT), DEC(NUMBER_EXACT), NUMERIC(NUMERIC_EXACT), INTEGER(NUMERIC_EXACT), INT(NUMERIC_EXACT), SMALLINT(NUMERIC_EXACT), FLAT(NUMERIC_APPROX), REAL(NUMERIC_EXACT), DOUBLE_PRECISION(NUMERIC_APPROX), DOUBLE(NUMERIC_APPROX), DATE(OTHER), TIME(OTHER), VARCHAR(OTHER), LONG_VARCHAR(OTHER)]

而在一個static {}區域

[TEXT, NUMERIC_EXACT, NUMERIC_APPROX, OTHER] 

的值,我有這樣的代碼:

for(ElementType eType : values()) { 
    TypeType t = eType.getTYPE(); 
    if(typeMapping.get(t) != null) 
     typeMapping.get(t).add(eType); 
    else 
     typeMapping.put(t, new ArrayList<ElementType>() {add(eType);}); 
} 

在for循環中提到的所有eType在Eclipse中都帶有下劃線。

第一個給出了錯誤eType cannot be resolved。第二個給出eType cannot be resolved to a variable

,第三個(在ArrayList內)給出Syntax error on token "eType", VariableDeclaratorId expected after this token

getTYPE()方法是私有的,並返回每個的ElementType的TypeType。 typeMapping是上面提到的HashMap。

我不知道是什麼原因造成這種或如何解決它,沒有人知道如何解決這個問題,或者我能做些什麼?

+0

*「in a static {} area」*:你的意思是在ElementType枚舉的靜態初始化中嗎? – assylias 2012-08-05 13:25:01

+0

下一次:_請不要寫一首詩,以便你能向我們展示5行代碼。代碼,我們可以立即剪切並粘貼到您的IDE中進行操作。參見[SSCCE](http://mindprod.com/jgloss/sscce.html)。 – 2012-08-05 14:05:01

回答

5

的問題是在這裏:

typeMapping.put(t, new ArrayList<ElementType>() {add(eType);}); 
               ^^^^^^^^^^^^^ 

您嘗試創建ArrayList得出的靜態初始化塊內部的內,非靜態類。如果用普通的new ArrayList加上alist.add(eType)代替它,它將起作用。

OR你可以使用:

typeMapping.put(t, new ArrayList<ElementType>() {{add(eType);}}); 

注1:必須有打開和關閉括號。因此總站"double brace initialization"

注2:DBI必須在循環使eTypefinal

雖然我不得不承認,那錯誤信息是ahem有些不清楚。

+2

如果選擇第二種方式,也需要將'eType'聲明轉換爲final。 – 2012-08-05 13:52:10

+0

@NikitaBeloglazov:你說得對。 – 2012-08-05 13:53:25

+0

謝謝,它修復了它,我得到的前兩個錯誤,我猜只是日食中的一個小故障。 – 2012-08-05 23:10:01

4

下面是編譯和我MACHING`的Java HotSpot的1.6.0_21' 工作的例子:

import java.util.*; 

public enum ElementType { 

    CHARACTER(TypeType.TEXT), CHAR(TypeType.TEXT), DEC(TypeType.NUMERIC_EXACT); 

    public static enum TypeType { 
     TEXT, NUMERIC_EXACT; 
    } 

    private TypeType type; 

    private ElementType(TypeType type) { 
     this.type = type; 
    } 

    private static Map<TypeType, List<ElementType>> typeMapping; 

    static { 
     typeMapping = new HashMap<TypeType, List<ElementType>>(); 
     for (ElementType eType : values()) { 
      TypeType t = eType.type; 
      if (!typeMapping.containsKey(t)) { 
       typeMapping.put(t, new ArrayList<ElementType>()); 
      } 
      typeMapping.get(t).add(eType); 
     } 

    } 

    public static void main(String[] args) { 
     System.out.println(typeMapping); 
    } 
} 

它是否適合你?