내 일반적인 방법으로 문제를 식별하려고 시도한 후 다음 코드로 끝났습니다.
Map<String, BiConsumerThatThrows<CheckPayment, XMLEventReader>> a = CheckPayment.childMapper;
BiConsumerThatThrows<CheckPayment, XMLEventReader> a1 = a.get("1");
BiConsumerThatThrows<? super CheckPayment, XMLEventReader> b1 = a1;
Map<String, BiConsumerThatThrows<? super CheckPayment, XMLEventReader>> b = new HashMap<>();
b.put("1", b1);
b = a;
다음 오류로 컴파일되지 않습니다 (더 읽기 쉽게 형식화했습니다).
[ERROR] /D:/lalala/MyClass.java:[152,27]
incompatible types:
java.util.Map<
java.lang.String,
blablabla.BiConsumerThatThrows<
blablabla.CheckPayment,
javax.xml.stream.XMLEventReader
>
>
cannot be converted to
java.util.Map<
java.lang.String,
blablabla.BiConsumerThatThrows<
? super blablabla.CheckPayment,
javax.xml.stream.XMLEventReader
>
>
가장 놀라운 것은 주어진 코드 조각의 마지막 줄에서만 충돌한다는 것입니다.
왜 발생합니까? 그러한 임무를 수행하기 위해 무엇을 할 수 있습니까?
Oracle JDK 1.8u40 x64를 사용하고 있습니다.
추신 다음은 간단한 예입니다.
Set<Set<String>> sets = new HashSet<>();
Set<Set<? super String>> sets2 = new HashSet<>();
sets2 = sets;
오류:
incompatible types: java.util.Set<java.util.Set<java.lang.String>> cannot be converted to java.util.Set<java.util.Set<? super java.lang.String>>
PPS 이것도 작동하지 않습니다.
Set<Set<Object>> sets2 = new HashSet<Set<String>>();
왜?
문제는 일반 형식 매개 변수 제약 조건이 중첩 제약 조건에 대해 투명하지 않다는 것입니다. A는와 Map<String, List<Integer>>
다른 유형이며 하나를 다른 유형에 Map<String, List<? super Integer>>
할당 할 수 없습니다. 이것이 당신이 여기에서 마주 치는 문제입니다.
이 문제를 해결하려면 다음을 사용하여 와일드 카드를 최상위 일반 선언에 적용해야합니다 extends
.
Map<String, ? extends List<? super Integer>> m = new HashMap<String, List<Integer>>()
참고이은을이다 extends
아닌 super
A가 있기 때문에 List<Integer>
A는 서브 의 유형 List<? super Integer>
(내가 아니라이 mindbending을 찾을 수 있습니다). 따라서 귀하의 경우 이것은 다음과 같습니다.
Map<String, ? extends BiConsumerThatThrows<? super CheckPayment, XMLEventReader>> b = ...
그리고 단순화 된 예 :
Set<? extends Set<? super String>> sets2 = new HashSet<>();
이를 이해하는 데 도움이 될 수 있습니다. http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ104
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다