2012-02-14 2 views
2

해시 맵을 사용하여 엔티티의 속성을 저장하려고합니다. 값은 내장 된 int 또는 ListString입니다.Java Hashmap의 타이핑 시스템은 무엇입니까?

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

나는 구글이 제공 발산하는 자습서를 읽은 후 입력 시스템지도의에 대한 혼란 스러워요. 가장 가까운 것은 String 키와 Object 값을 사용하는 것이 었습니다.


질문 : 값을 가져올 때, 그것은 (형의 멤버로 식별) 배역이되도록 내가 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) 

답변

3

수 없습니다.

의 int와
Object value = map.get(key); 

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

, 당신은 원시적 인 int 형을 저장할 수 있지만, 자동 될 것입니다 : 어느 쪽이든 당신은 객체로 값을 반환 상점과지도의 기본 양식을 사용, 당신은 그들에게 자신을 캐스팅해야 - 정수에 박스. 따라서 instanceof 정수를 확인한 다음 Integer 개체에서 .intValue()을 호출해야합니다.

객체로 반환 된 객체를 얻으려면 Generics를 사용해야하지만 유형을 혼합 할 수는 없습니다. 따라서 List<String> 속성의 Map과 int 속성의 Map을 만들어야합니다.

1

당신이 제안하는 것은 algebraic data type의 예입니다. 유감스럽게도 Java에서는 지원되지 않습니다.

지도를 사용하여 값을 Integer (int)로 캐스팅하거나 List를 직접 작성해야합니다.

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