0

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

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

4

2 回答 2

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
}
于 2013-11-12T17:18:45.897 回答
-2

java MAP 不能包含重复的键。因此,当您尝试将第二个项目(键)放入具有相同类型 TRANSPARENT 的地图中时,它会崩溃。我认为您需要一种不同类型的方法(或不同类型的集合)。

尽管我没有足够的信息来说明您要完成的工作以提出建议,但这可能会给您一些想法:

创建一个新的包装对象,其中存储 someStuff 和数据类型。示例:创建具有如下构造函数的 MyWrapper 类: MyWrapper(DataType.TRANSPARENT, "someStuff");

现在你可以使用这个: Map myMapLikeObject;

其中 String 是一些独特的短语,用于描述项目“someStuff”。

于 2013-11-12T17:37:27.627 回答