2014-12-25 2 views
2

Map 인 경우 필요합니다. 맵의 값은 다른 데이터 유형의 값이므로 Object 유형입니다. Object을 사용하면 내 문제를 해결할 수 있지만 get(key)HashMap에서 시도 할 때마다 타이프 변환해야합니다.지도에서 추출 할 때 문자를 제거 할 때

이러한 빈번한 타입 캐스팅을 제거하는 데 도움이되는 라이브러리가 있습니까?

미리 감사드립니다.

+0

유형이 다른 경우 어떻게 전송할 수 있다고 상상합니까? 도서관이 당신이 염두에두고있는 유형을 추측하는지 아니면 텔레파시로 정보를 전송하겠습니까? 귀하의 질문에 대한 실제 답변은 : 동일한지도에 다른 유형의 객체를 넣지 마십시오. 나쁜 습관입니다. – Dima

+0

@Dima 당신은 그것에 대해 절대적으로 옳습니다. 그러나 가치의 수는 전용 클래스를 만드는 것을 정당화하기에 충분하지 않습니다. 그래서 현재지도에 의존하고 있으며 실제로 그것을 싫어합니다. – Vishnu

+1

수업을 만드는 데 충분하지 않은 이유는 무엇입니까? 단점은 무엇입니까? – Dima

답변

3

아니요. Object 유형을 사용하여지도의 값을 저장해야하는 경우 캐스팅을 피할 수 없습니다.

Map에 포함될 수있는 모든 값 유형이 공통 인터페이스를 구현하거나 공통 기본 클래스를 갖는 것이 합리적인지 고려해야합니다. 이렇게하면 Object을보다 구체적인 유형으로 대체하고 전송할 필요성을 줄이거 나 제거 할 수 있습니다.

2

당신은 당신의 자신의 IMPL 내부의 캐스트를 숨길 수 : 당신이 그것을 사용할 때

public class FlexiMap extends HashMap<String, Object> { 
    public <T> T getType(String key) { 
     return (T)get(key); 
    } 
} 

자바 유형을 추론 할 수있다.

Boolean b = myMap.getType("foo"); // no cast 
+0

아큐 ...이 방법의 단점을 언급하지 않아야할까요? 컴파일 시간 유형 시스템을 완전히 우회하여 * 힙 오염을 일으킬 수 있습니다 *? – meriton

+0

@ 보헤미안 그것은 그것을 다루는 한 가지 방법입니다. 그러나 Dima가 의견에서 지적했듯이 나는 수업을 만들고지도에 저장하는 것의 중간 지점을 찾지 못했습니다. 아니면 최소한 노력할만한 가치가 없습니다. 새 클래스를 만들려고한다면 Map의 래퍼가 아닌 값을 만들 수도 있습니다. – Vishnu

관련 문제