java.util을 변환하고 있습니다.해시맵 속성
Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>(properties);// why wrong?
java.util.Properties 는 의 실장입니다.또, 의 컨스트럭터는, 다음의 것을 수신합니다.Mapparammody 라고 합니다.그렇다면, 왜 그것을 명시적으로 변환해야 하는가?
이는 가 확장되기 때문입니다(이것에 의해,Map<Object, Object>.Map<String, String>따라서 호환되지 않습니다.
문자열 속성을 하나씩 지도에 입력해야 합니다.
예:
for (final String name: properties.stringPropertyNames())
map.put(name, properties.getProperty(name));
이를 위한 효율적인 방법은 다음과 같이 일반적인 지도에 캐스팅하는 것입니다.
Properties props = new Properties();
Map<String, String> map = (Map)props;
" " " 가 됩니다.Map<Object, Object>(경고만 해당) 컴파일러에 대해 "OK"인 원시 맵으로 이동합니다.만 MapMap<String, String> 다른 경고될 이다.OK' (알겠습니다).@SuppressWarnings({ "unchecked", "rawtypes" })
JVM에서는 오브젝트에 범용 타입이 없기 때문에 동작합니다.범용 타입은 컴파일 시에 검증하는 트릭에 지나지 않습니다.
키 String이 됩니다.ClassCastException 현재 ★★로 되어 . 전류 있음Properties 슈퍼 콜메서드, 슈퍼 하지 않습니다.Hashtable<Object,Object>Properties.
따라서 Properties 인스턴스에서 나쁜 짓을 하지 않는 것이 좋습니다.
Google Guava를 사용할 수 있습니다.
com.google.common.collect 를 선택합니다.Maps.fromProperties(속성)
이건 어때?
Map properties = new Properties();
Map<String, String> map = new HashMap<String, String>(properties);
경고를 발생시키지만 반복 없이 작동합니다.
Java 8의 방법:
properties.entrySet().stream().collect(
Collectors.toMap(
e -> e.getKey().toString(),
e -> e.getValue().toString()
)
);
Properties를 실장하다Map<Object, Object>안 돼 - 안 돼Map<String, String>.
이 컨스트럭터를 호출하려고 합니다.
public HashMap(Map<? extends K,? extends V> m)
함께...와 함께K ★★★★★★★★★★★★★★★★★」V 다로서String.
★★★★★★★★★★★★★★★★★.Map<Object, Object>안 그래?Map<? extends String, ? extends String>키 및 을 포함할 수 . 문자열이 아닌 키 및 값을 포함할 수 있습니다.
이 방법은 다음과 같습니다.
Map<Object, Object> map = new HashMap<Object, Object>();
하지만 당신에게는 별로 도움이 되지 않을 겁니다
본 fundament fundament fundament fundament fundamentProperties 했다.HashTable그게 문제예요v1 이후로는 의도와는 달리 String 이외의 키와 값을 항상 저장할 수 있게 되었습니다.컴포지션을 대신 사용했다면 API는 문자열 키/값으로만 작동할 수 있었을 것이고 모든 것이 정상이었을 것입니다.
다음과 같은 것이 필요할 수 있습니다.
Map<String, String> map = new HashMap<String, String>();
for (String key : properties.stringPropertyNames()) {
map.put(key, properties.getProperty(key));
}
com.google.common.collect의 Guava API를 사용합니다.맵 #fromProperties
Properties properties = new Properties();
Map<String, String> map = Maps.fromProperties(properties);
그 사실을 안다면Properties에는 '''만 .<String, String> 타입에 할 수 .raw 타입은 raw 타입입니다.
Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>((Map) properties);
문제는 말이다Properties용구Map<Object, Object>단,HashMap컨스트럭터는Map<? extends String, ? extends String>.
이 답변은 이(매우 직관에 반하는) 결정을 설명합니다.한마디로 Java 5 이전에는Properties실장했다Map(그때는 제네릭이 없었기 때문에)즉, 어떤 것이든 Object에 있어서Properties물건.이는 아직 매뉴얼에 기재되어 있습니다.
왜냐면
Properties에서 상속하다.Hashtable,그put그리고.putAll메서드는 에 적용할 수 있습니다.Properties물건.발신자가 키 또는 값이 입력되지 않은 엔트리를 삽입할 수 있으므로 이러한 사용은 권장되지 않습니다.Strings. 그setProperty대신 메서드를 사용해야 합니다.
이와 호환성을 유지하기 위해 설계자는 이를 상속할 수밖에 없었습니다.Map<Object, Object>Java 5로 설정합니다.이는 새로운 코드를 불필요하게 복잡하게 만드는 완전한 역호환성을 추구한 결과입니다.
에서 문자열 속성만 사용하는 경우Properties오브젝트는 컨스트럭터에서 체크되지 않은 캐스팅으로 빠져나갈 수 있습니다.
Map<String, String> map = new HashMap<String, String>( (Map<String, String>) properties);
또는 복사본이 없는 경우:
Map<String, String> map = (Map<String, String>) properties;
이는 HashMap의 컨스트럭터에는 Map 범용 타입의 arg가 필요하며 Properties는 Map을 구현하기 때문입니다.
이 방법은 작동하지만 경고와 함께 작동합니다.
Properties properties = new Properties();
Map<String, String> map = new HashMap(properties);
다음을 사용할 수 있습니다.
Map<String, String> map = new HashMap<>();
props.forEach((key, value) -> map.put(key.toString(), value.toString()));
일단은
속성 클래스는 해시맵이 아닌 해시테이블을 기반으로 합니다.속성 클래스는 기본적으로 해시 테이블을 확장합니다.
속성 개체를 가져와서 해시 맵 개체를 반환하는 이러한 생성자는 HashMap 클래스에 없습니다.그래서 네가 하는 일은 옳지 않아.해시 테이블 참조에 속성 개체를 캐스팅할 수 있어야 합니다.
나는 이것을 사용한다:
for (Map.Entry<Object, Object> entry:properties.entrySet()) {
map.put((String) entry.getKey(), (String) entry.getValue());
}
Spring Framework 소스 코드를 보면 이렇게 생각됩니다.
Properties props = getPropertiesFromSomeWhere();
// change properties to map
Map<String,String> map = new HashMap(props)
언급URL : https://stackoverflow.com/questions/17209260/converting-java-util-properties-to-hashmapstring-string
'source' 카테고리의 다른 글
| 오류 발생 시 python 디버거를 자동으로 시작하는 중 (0) | 2022.09.22 |
|---|---|
| MySQL 행 형식:고정과 동적의 차이점 (0) | 2022.09.22 |
| 그룹별 오브젝트 인쇄 방법 (0) | 2022.09.22 |
| peacle.dump 사용 - TypeError:는 바이트가 아닌 str이어야 합니다. (0) | 2022.09.22 |
| 릴레이셔널 데이터베이스를 수평으로 확장할 수 있다 (0) | 2022.09.22 |