我想用hashmap存储实体的属性。该值可以是int
的内置List
或String
。
name : "John Smith"
attributes:
"seniority" : (int) 7
"tags" : List<String>("asst_prof","cs_dept")
"another_attrib" : (int) 3
在阅读Google提供的不同教程之后,我对地图的打字系统感到困惑。我最接近的是使用String
键和Object
值的东西。
问题:如何创建Hashmap并插入int
或List<String>
的值,以便在我获取值时,强制转换(已识别)作为类型的成员作为int
或List<String>
,而不是Object
。
我依赖于Drools Expert软件包accesses values from maps by itself,因此类型转换不在我的控制中。
// Same as attributes.get("jsmith").isValid()
Person( attributes["jsmith"].valid )
答案 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
...