2012-02-14 38 views
2

我想用hashmap存储一个实体的属性。该值可以是内嵌的intStringList什么是Java Hashmap的打字系统?

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

我感到困惑的类型系统的地图,读书发散教程谷歌给出了。我最接近的是使用String键和Object值的东西。


问题:如何创建一个HashMap和插入的intList<String>值,这样,当我取的值,这是类型转换(被标识为类型的成员)作为任一种intList<String>,而不是Object

我依赖于Drools专家包,其中accesses values from maps by itself,所以类型为不在我的控制

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

回答

3

你不能。无论您使用地图存储和返回值对象的基本形式,那么你必须自己丢掉。

Object value = map.get(key); 

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

有了整数,你不能存储原始int类型,但它会自动装箱到一个整数。因此,您必须检查instanceof Integer,然后在Integer对象上调用.intValue()

要获取作为对象返回的对象,则必须使用泛型,但不能混合使用泛型。所以你必须创建一个List<String>属性的Map和另一个int属性。

1

你提出的是一个algebraic data type的例子。不幸的是,这些在Java中不受支持。

您需要使用Map并将值转换为Integer(int)或List your。

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 
...