我正在参考 Joshua Bloch 的《Effective Java》中的第34项范例。我想采用他使用的方法,即让每个相关的枚举实现一个基本接口,并从“子枚举”初始化 EnumMap。请参见下面的代码部分。我遇到了一个语法错误,但我不理解为什么会出错。我并没有确定要使用这种实现方法,但我想了解为什么它不能正常工作。
请注意,此示例假定每个类定义都在其自己的文件中。
请注意,此示例假定每个类定义都在其自己的文件中。
public interface BaseEnum {
...
}
public enum EnumOps1 implements BaseEnum {
...
}
public class Widget {
public Widget() {
regMap = new EnumMap<EnumOps1, WidgetData>(EnumOps1.class);
for (EnumOps1 op : EnumOps1.values()) {
regMap.put(op, getWidgetData(op.key())); // line with syntax error
}
}
protected Map<? extends BaseEnum, WidgetData> regMap;
}
语法错误细节:
接口 java.util.Map
<K,V>
中的方法put不能应用于给定的类型
必需类型:? extends BaseEnum, WidgetData 的捕获#1
发现类型:EnumOps1, WidgetData
? extends BaseEnum
,这意味着regMap
变量的键是BaseEnum
的 某个未指定的子类。向其中添加元素是 不安全的,因为根据静态类型(即 某个未指定的子类型),你无法知道必须添加到集合中的具体子类型。如果你弄错了,就会违反类型安全性,编译器无法验证,因此禁止这样做。这有意义吗? - Steven Schlansker