2

我目前正在开发一个项目(数据库实现),该项目涉及一个枚举类ElementType,其内部枚举名为TypeType. 里面ElementType有一个HashMap<TypeType, ArrayList<ElementType>>将所有的映射ElementType到它们对应的TypeType值。

TypeType的值为

[TEXT, NUMERIC_EXACT, NUMERIC_APPROX, OTHER]

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 {}区域,我有这个代码:

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);});
}

eType在 for 循环中提到的所有内容在 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。就是上面提到的typeMappingHashMap。

我不知道是什么导致了这个或如何解决它,有谁知道如何解决这个问题,或者我能做什么?

4

2 回答 2

5

问题在这里:

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

ArrayList您尝试创建从静态初始化程序块内部派生的内部非静态类。如果您将其替换为普通的new ArrayListplus alist.add(eType),它将起作用。

或者你可以使用:

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

注 1:必须有两个左大括号和右大括号。因此,终点是“双括号初始化”

注意 2:对于 DBI,您必须eType final在循环中进行。

虽然我不得不承认,错误消息有点不清楚。

于 2012-08-05T13:48:29.707 回答
4

这是一个在我的机器“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);
    }
}

对你起作用吗?

于 2012-08-05T13:43:46.570 回答