3

我想存储 aInteger或 a Double,两者都从Number, 延伸到 a HashMap,并在不强制转换的情况下检索它们。原因是我最终会有很多不同的子类型(我只是使用Number/Integer来说明),并且我不想在引入不同的子类型时编写新方法。我可以getFromMap()在下面构造和调用,而不必对Doubleor进行强制转换Integer吗?

public class MapOfContent {
    static Map<String, Number> hm = new HashMap<String, Number>();

    public static void main(String[] args) {
        addToMap(hm, Integer.valueOf(3), "An Integer");
        addToMap(hm, Double.valueOf(3.4), "A Double");

        Double d;

        d = (Double) getFromMap(hm, "A Double");
        //d = getFromMap(hm, "A Double");

        System.out.println("Result-> " + d);

    }

    private static void addToMap(Map<String, ? super Number> hashmap, Number c, String key) {
        hashmap.put(key, c);
    }

    private static <T> Number getFromMap(Map<String, ? extends Number> hashmap, String cmsKey) {
        return hashmap.get(cmsKey);
    }
}
4

2 回答 2

2

没有办法让这种方法真正成为类型安全的;如果你尝试过(Double) getFromMap(hm, "An Integer")呢?那应该失败。

一种可能的替代方法是使用实​​际Class对象作为键,例如使用Guava ClassToInstanceMap

ClassToInstanceMap<Number> map = MutableClassToInstanceMap.create();
map.putInstance(Integer.class, Integer.valueOf(3));
map.putInstance(Double.class, Double.valueOf(3.4));

Double aDouble = map.getInstance(Double.class); // no cast required
于 2012-07-14T14:24:34.087 回答
0

如果您将不同类的对象存储在集合中并且在获取它们时,您需要访问它们实际类型的字段/方法,而不仅仅是它们的共同祖先,那么不需要。

在某个地方会有一个显式的强制转换,你能做的最好的就是把它推得很深,并把它从代码的所有其他部分隐藏起来,就像ClassToInstanceMap这样。

于 2012-07-14T14:24:59.453 回答