我目前正在开发一个项目(数据库实现),涉及一个名为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);});
}
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 :(得分:5)
问题在于:
typeMapping.put(t, new ArrayList<ElementType>() {add(eType);});
^^^^^^^^^^^^^
您尝试在静态初始化程序块中创建从ArrayList
派生的内部非静态类。如果将其替换为普通new ArrayList
加alist.add(eType)
,则可以使用。
或您可以使用:
typeMapping.put(t, new ArrayList<ElementType>() {{add(eType);}});
注1:必须有两个开启和关闭大括号。因此终点"double brace initialization"。
注意2:对于DBI,您必须在循环中设置eType
final
。
虽然我不得不承认,错误消息 ahem 有点不清楚。
答案 1 :(得分: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);
}
}
它对你有用吗?