Java映射混合类型

jed*_*rds 7 java hashmap

我正在寻找一种方法来创建映射到混合类型的HashMap.

例如,以下内容适用于Python(请注意,Python dict类似于Java HashMap):

d = dict()
d["str"] = "This is a string"
d["flt"] = 1.23
d["int"] = 5
Run Code Online (Sandbox Code Playgroud)

并且在访问时d[x],将返回适当的类型(在此示例中为string,float,int).

在Java中,我可以使用a HashMap<String, Object>,但我真的没有办法立即告诉每个Object的类型.

所以相反,我现在要做的是创建一个MixedType包含对象的类,还有它的原始类型信息,以便我可以在以后将其转发.例如:

public class MixedMap
    public static class MixedType
    {
        public Class<?> cls;
        public Object val;

        public MixedType(Class<?> c, Object v)
        {
            this.cls = c;
            this.val = v;
        }
    }

    public static void main(String args[])
    {   
        MixedType m1 = new MixedType(String.class, "This is a String");
        System.out.println((m1.cls)m1.val);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是我正在尝试做的事情:-)因为它目前没有编译抱怨m1 cannot be resolved to a type.

所以我的问题是,我该如何解决这个问题呢?实现相同目标的其他方法将受到欢迎,但请不要回答告诉我这限制了编译器的类型检查能力 - 我知道并且可以使用它.

提前致谢.

Lou*_*man 7

正确的做法是m1.cls.cast(m1.val),但与平原相比,你几乎肯定不会获得任何东西 Map<String, Object>.一种更简单的方法可以让您获得完全相同的类型安全性和完全相同的信息 - 也就是说,并不多 - 只是在地图中getClass()Object值上使用该方法.

这些都不会达到你能够说出的目标String value = map.get("str")- 没有任何一个直接演员会做到这一点.你可以做到

Object value = map.get("str");
if (value instanceof String) {
  // do stringy things
}
Run Code Online (Sandbox Code Playgroud)

或类似的规定.

如果您在编译时知道其使用点的值的类型,那么到目前为止,最好的解决方案就是继续在使用点进行转换.像这样进行配置的"理想"方式一般不是使用a Map,而是Configuration在编译时构建一个知道其字段及其类型的自定义类,但如果你想使用a Map,那么直接进行强制转换就是可能是你最好的选择.