[英]How can I downcast to class' type E or at least make it in a safe way without warnings?
[英]How can I store data in a lookup in a type safe way?
假设我有一个像这样的数据结构:
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");
?
从未尝试过通用枚举,但我认为您可以这样做:
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
}
Java MAP不能包含重复的键。 因此,当您尝试使用相同类型的TRANSPARENT将第二个项(键)放入地图时,它将崩溃。 我认为您需要使用不同类型的方法(或不同类型的集合)。
尽管我实际上没有足够的信息来了解您要完成的工作以提出建议,但这可能会给您一些想法:
创建一个新的包装对象,在其中存储someStuff和数据类型。 示例:创建MyWrapper类,该类将具有如下构造函数:MyWrapper(DataType.TRANSPARENT,“ someStuff”);
现在您可以使用:Map myMapLikeObject;
其中String是描述项目'someStuff'的一些唯一的简短短语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.