繁体   English   中英

我能避免使用Generics这个演员吗?

[英]Can I avoid This Cast with Generics?

我想将一个从Number扩展的IntegerDouble存储到HashMap ,并在不进行强制转换的情况下检索它们。 原因是我最终会有很多不同的子类型(我只使用Number / Integer来说明),而且我不想在引入不同的子类型时编写新方法。 我可以构造并调用下面的getFromMap()而不必将转换为DoubleInteger吗?

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

没有办法真正使这种方法真正的类型安全; 怎么试试(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

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

在某个地方会有一个显式的ClassToInstanceMap转换,你可以做的最好的事情就是将其深入并将其隐藏在代码的所有其他部分,就像ClassToInstanceMap那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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