2014-05-18 2 views
3

사용중인 API가 Map<String, Object>을 반환하는 메서드를 가지고 있지만 Object이이 경우 String 인 것을 알고 있으므로 원합니다. Map<String, String>으로지도 <String, Object>를 Map <String, String>으로 변환하십시오.

하지만 웬일인지 나는 그것을 캐스트 할 수 없다. 자바는 을 Map<String, String>으로 캐스팅 할 수 없다고 말한다. 해결 방법으로

Map<String, Object> tempMap = someApiMethodReturningAMap(); 
Map<String, String> map = new HashMap<String, String>(); 
for (String i : tempMap.keySet()) { 
    map.put(i, String.valueOf(tempMap.get(i))); 
} 

하지만 더 쉬운 방법이있다 :

내가 사용?

+3

, 난 단지 추천 할 것입니다 당신이 조회를 피함으로써이 약간 더 효율적으로 만들 수 있지만

당신의 접근 방식은 안전합니다 캐스트를 'String.valueOf()'로 변경하려면 Object 인수의 toString() 메서드에 의미있는 impl이 있어야합니다. – hovanessyan

+0

@hovanessyan 감사합니다. 편집 됨. –

답변

11

그럼 당신은 Map<String, String>을하지 안전하게 캐스트를 비록 당신은 단지 값으로 문자열을 가지고 알고을, 컴파일러가 없기 때문에 할 수 있습니다. 예상과 같습니다.

Object x = "foo"; 
String y = x; 

- 작동하지 않습니다. 당신은 명시 적으로 캐스트해야합니다.

Map<String, Object> x = ...; 
Map<String, String> y = (Map<String, String>) (Object) x; 

지금 당신이 경고가이 되지 않은 캐스트 있다고 말하는거야 때문에 문자열로 이전 "개체 달리 : 당신이 Object를 통해 가면

마찬가지로 명시 적으로도, 여기에 캐스트 할 수 있습니다 "캐스팅, 실제로 유효하다는 실행 시간 확인이 없습니다. 유형 지우기는지도가 키/값 유형을 실제로 알지 못한다는 것을 의미합니다. 요소를 가져올 때 그래서 당신은 단지 수행되는 검사와 끝까지 :

import java.util.*; 

class Test { 
    public static void main(String[] args) { 
     Map<String, Object> x = new HashMap<>(); 
     x.put("foo", "bar"); 
     x.put("number", 0); 
     Map<String, String> y = (Map<String, String>) (Object) x; 
     // This is fine 
     System.out.println(y.get("foo")); 

     // This goes bang! It's trying to cast an Integer to a String 
     System.out.println(y.get("number")); 
    } 
} 

그래서 당신은 정말 새로운 맵을 만들지 않도록하려는 경우,이 "Object를 통해 캐스팅"작동합니다 -하지만, 그것은 이상적인 것과는 떨어져 있습니다.

public static Map<String, String> copyToStringValueMap(
     Map<String, Object> input) { 
    Map<String, String> ret = new HashMap<>(); 
    for (Map.Entry<String, Object> entry : input.entrySet()) { 
     ret.put(entry.getKey(), (String) entry.getValue()); 
    } 
    return ret; 
} 
2

A가 자바 8 솔루션 :

쉽게 이해할 수있는 방법
private Map<String, String> stringifyValues(Map<String, Object> variables) { 
    return variables.entrySet().stream() 
      .collect(Collectors.toMap(Map.Entry::getKey, e -> (String) e.getValue())); 
} 
관련 문제