2016-08-15 3 views
2

이 사실을 알고 있어야하지만 어떤 이유로이 사실을 이해할 수 없습니다.캐스트 목록 <Object> 목록에 <Map <String, Object >>

왜지도 목록 List<Object>을 캐스팅하지 못합니까? List<Map<String, Object>>? 목록의 모든 객체는 Map<String, Object> 유형의 객체이므로 캐스팅이 불가능한 이유는 무엇입니까?

내가 할 수있는 것은 new ArrayList<Map<String, Object>>();을 만들고 목록을 반복하여 각 항목을 캐스트와 함께 추가하는 것입니다.

List<Object> dataList; 
.. 
//Why doesn't this work? 
List<Map<String, Object>> rxData = (List<Map<String, Object>>)dataList; 

//This works, but is there a better way? 
rxData = new ArrayList<Map<String, Object>>(); 
for (Object data : dataList) { 
    rxData.add((Map<String, Object>)data); 
} 
+0

왜? Java의 generics는 재정의 할 수 없기 때문에. JVM이 실제로 캐스트를 검사 할 수있는 방법이 없습니다. 어쨌든 그냥하고 싶다면'@SuppressWarnings ("unchecked")가 해결책이라고 생각합니다. – markspace

+1

Java generics FAQ : http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20the%20SuppressWarnings%20annotation? – markspace

답변

3

당신은 더블 캐스팅으로 일반적인 매개 변수를 제거 할 수 있습니다 :

@SuppressWarnings("‌​unchecked") 
List<Map<String, Object>> rxData = 
    (List<Map<String, Object>>) (List<?>) dataList; 

다음 여기에서가는 먼저 캐스트를 생략하여 제네릭 형식을 확인하지 컴파일러를 강제한다는 것입니다되며, 선택하지 않은 수행 캐스트는 List<Map<String, Object>>입니다. 이것은 Java generics가 refiable이 아니기 때문에 가능합니다.

원래 오류가 ObjectMap<> 유형과 호환되지 않으며 (예를 들어 scala 달리) 자바 에서 공변/contravariant 종류와 같은 같은 것은이 없다는 사실에 기인한다.

dataList에지도가 포함되어 있어도 문제가 발생할 수 있습니다.

+2

여기에 원시 형식을 사용할 필요가 없으며 문제는 재사용 가능성과 관련이 없습니다. –

+0

@ k5_이 (가) 동의합니다. 감사! 그러나 어쨌든 그것은 체크되지 않을 것입니다. 내 대답을 편집합니다 – vsminkov

+0

감사합니다! 좋아, 나는 이해한다고 생각한다. 목록에지도 외에 아무것도 포함되지 않도록 조심해야한다. – Andy

4

List<Object>List<Map<String, Object>>are not compatible types이므로 직접 서로 전송할 수 없습니다. 먼저 캐스트에 공통의 슈퍼 후 내리 뜬을해야 할 것입니다 : 당신은 여전히 ​​컴파일 타임에 경고를 얻을 것이다

List<Map<String, Object>> rxData = (List<Map<String, Object>>)(List<?>)dataList; 

참고, 그것이 unsafe cast 때문에. 링크

https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

두 일반적인 클래스 타입 1과 타입 2 다음

0

검사는 전혀 관련이 없습니다. 그래서 당신은 하나를 다른 것으로 타입 변환 할 수 없습니다.

그러나 안전하지 않은 작업을 수행하고 루프에서 벗어날 수 있습니다.

//unsafe assignments 
List rxData = (List<Map<String, Object>>)dataList; 

List<Object> dataList = (List<Object>)rxData; 
관련 문제