여기에 무슨 일이 일어나고 있는지에 관해서는 저에게 힌트를주십시오 캡처 충돌 :팬시 제네릭
List<? extends Number> a = new ArrayList<Number>();
List<? extends Number> b = new ArrayList<Number>();
a.addAll(b); // ouch! compiler yells at me, see the block below:
/*
incompatible types
found : java.util.List<capture#714 of ? extends java.lang.Number>
required: java.util.List<java.lang.Number>
*/
이 간단한 코드는 컴파일되지 않습니다. 나는 캡쳐와 관련된 뭔가를 막연하게 기억하고있다. 실제 코드가 아닌 인터페이스 스펙에 주로 사용되어야하는 것과 같은 형식 캡쳐와 관련이있다. 그런 식의 어리석은 일은 결코 없다. 물론
이
그렇게, 짐승 - 강제로 고정 될 수 있습니다List<? extends Number> a = new ArrayList<Number>();
List<? extends Number> b = new ArrayList<Number>();
@SuppressWarnings({"unchecked"})
List<Number> aPlain = (List<Number>) a;
@SuppressWarnings({"unchecked"})
List<Number> bPlain = (List<Number>) b;
aPlain.addAll(bPlain);
그래서, 어떻게 내가 정말 (캡처가 인터페이스에서 나에게 와서 선언에 캡처를 포기 중 하나가, 그래서 일부 API를 변경해야 할 것입니다.) 또는 억제 주석이있는 타입 캐스트 (일반적으로 코드를 빨아 들이고 코드를 약간 복잡하게합니다)를 사용합니까?
하이의 슈퍼 타입 이다 Object 형식의 값에 대한 제외하고 SUPER 와일드 카드로 선언 된 유형에서 무엇을 얻을, 왜 그냥 목록'로'A'를 선언하지= 새로운 ArrayList()'? –
Axel
글쎄, 나는 List를 나에게 돌려 줄 때 이미이 캡쳐를 선언 한 API를 가지고있다. 나는 물건을 더 단순하게 유지하면서 생성자를 조금 더 (애매하게) 보이지 않게 만드는 데에만 사용한다. –