그럼 당신은 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;
}
, 난 단지 추천 할 것입니다 당신이 조회를 피함으로써이 약간 더 효율적으로 만들 수 있지만
당신의 접근 방식은 안전합니다 캐스트를 'String.valueOf()'로 변경하려면 Object 인수의 toString() 메서드에 의미있는 impl이 있어야합니다. – hovanessyan
@hovanessyan 감사합니다. 편집 됨. –