假设我有这样的数据结构:
Map<DataType, Object> myMapLikeObject;
public enum DataType {
TRANSPARENT, PASSABLE, PASSAGE_COST;
}
我想要实现的是将每个枚举常量与这样的数据类型相关联:
public enum DataType {
TRANSPARENT(Boolean.class),
PASSABLE(Boolean.class),
PASSAGE_COST(Integer.class);
}
所以,如果我尝试myMap.put(DataType.TRANSPARENT, "someStuff");
,我可以验证输入并抛出异常,因为它不是Boolean
。到目前为止,这会导致运行时错误。
如何通过以下调用编写会导致编译时错误的代码:
myMap.put(DataType.TRANSPARENT, "someStuff");
?
答案 0 :(得分:1)
从未尝试过通用枚举,但我认为你可以这样做:
public enum DataType<T> {
TRANSPARENT<Boolean>(Boolean.class),
PASSABLE<Boolean>(Boolean.class),
PASSAGE_COST<Integer>(Integer.class);
private Class<T> type;
private DataType<T>(Class<T> type) { this.type = type; }
public Class<T> getType() { return type; }
}
public class DataTypeMap {
private Map<DataType<?>, Object> map = new HashMap<DataType<?>, Object>();
public <T> void put(DataType<T> dataType, T value) {
map.put(dataType, value);
}
public <T> T get(DataType<T> dataType) {
Object value = map.get(dataType);
return dataType.getType().cast(value);
}
}
public void someMethod() {
DataTypeMap map = new DataTypeMap();
map.put(DataType.TRANSPARENT, true);
map.put(DataType.PASSAGE_COST, 12345);
map.put(DataType.PASSAGE_COST, "some string"); // compile error
boolean flag = map.get(DataType.TRANSPARENT);
int number = map.get(DataType.PASSAGE_COST);
String string = map.get(DataType.PASSAGE_COST); // compile error
}
答案 1 :(得分:-2)
java MAP不能包含重复的键。因此,当您尝试使用相同类型的TRANSPARENT将第二个项目(键)放入地图时,它将崩溃。我认为你需要一种不同类型的方法(或不同类型的集合)。
虽然我没有足够的信息来说明你想要提出什么建议,但这可能会给你一些想法:
创建一个新的包装器对象,其中存储someStuff和数据类型。 示例:创建具有构造函数的MyWrapper类,如下所示: MyWrapper(DataType.TRANSPARENT,“someStuff”);
现在你可以使用这个: 映射myMapLikeObject;
其中String是一个描述项目'someStuff'的唯一短语。