Java Hashmap的输入系统是什么?

时间:2012-02-14 10:09:22

标签: java hashmap drools

我想用hashmap存储实体的属性。该值可以是int的内置ListString

name : "John Smith"
attributes:
   "seniority" : (int) 7
   "tags" : List<String>("asst_prof","cs_dept")
   "another_attrib" : (int) 3

在阅读Google提供的不同教程之后,我对地图的打字系统感到困惑。我最接近的是使用String键和Object值的东西。


问题:如何创建Hashmap并插入intList<String>的值,以便在我获取值时,强制转换(已识别)作为类型的成员作为intList<String>,而不是Object

我依赖于Drools Expert软件包accesses values from maps by itself,因此类型转换不在我的控制中

// Same as attributes.get("jsmith").isValid()
Person( attributes["jsmith"].valid )

3 个答案:

答案 0 :(得分:3)

你做不到。您可以使用存储的基本形式Map并将值作为对象返回,然后您必须自己投射它们:

Object value = map.get(key);

if (value instanceof List<String>) {
    List<String> myList = (List<String>) value;
}

使用整数,您不能存储基本类型int,但它将自动装箱为整数。因此,您必须检查instanceof整数,然后在.intValue()对象上调用Integer

要将对象作为对象返回,那么您必须使用泛型,但不能混合类型。因此,您必须创建一个List<String>属性的Map,另一个用于int属性。

答案 1 :(得分:1)

您提出的是algebraic data type的示例。不幸的是,Java不支持这些。

您需要使用Map并将值转换为Integer(int)或自己列出。

答案 2 :(得分:1)

在Drools中,如果需要,可以禁用特定类型的编译时类型安全性。在这种情况下,Drools将作为动态类型语言工作,并将在运行时为给定类型解析类型。例如:

declare Person
    @typesafe(false)
end

rule X
when
    Person( attributes["seniority"] == 7 ) // resolving seniority to Number
...

rule Y
when
    Person( attributes["tags"].size() > 1 ) // resolving tags to List
...