2012-02-14 15 views
2

ハッシュマップを使ってエンティティの属性を保存します。値は、組み込みのintまたはListのいずれかです(String)。Java Hashmapのタイピングシステムとは何ですか?

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

私は、Googleが与えられる発散のチュートリアルを読んだ後、地図のタイピングシステムについて混乱しています。私が一番近かったのはStringのキーとObjectの値を使ったものでした。


質問:私は値をフェッチするとき、それは(タイプのメンバーとして同定)型キャストであるように、私は、intまたはList<String>の値をHashMapを作成して挿入するにはどうすればよいのいずれかとしintまたはList<String>であり、Objectではありません。

私はDrools Expertパッケージに依存していますが、accesses values from maps by itselfなので、型キャスティングはであり、私のコントロールにはありませんです。

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

答えて

3

できません。 int型で

Object value = map.get(key); 

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

を、あなたはプリミティブ型intを保存することはできませんが、それが自動になります:あなたは店とあなたがそれらを自分でキャストする必要があり、その後、オブジェクトとしての値を返すこと地図の基本的なフォームを使用しますか - 整数にボックス化されています。したがって、instanceof整数を確認してから、Integerオブジェクトの.intValue()に電話する必要があります。

オブジェクトとして返されるオブジェクトを取得するには、ジェネリックスを使用する必要がありますが、タイプを混在させることはできません。したがって、List<String>属性のMapとint属性のMapを作成する必要があります。

1

algebraic data typeの例が提案されています。残念ながら、これらはJavaではサポートされていません。

マップを使用して値をInteger(int)またはキャストする必要があります。

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 
... 
関連する問題