如何以类型安全的方式将数据存储在查找中?

时间:2013-11-12 15:20:40

标签: java data-structures compiler-errors

假设我有这样的数据结构:

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

2 个答案:

答案 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'的唯一短语。