繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM