2012-02-14 93 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 
...