2016-07-27 3 views
3

제네릭에 대한 질문이 있습니다.한계가있는 제네릭을 컴파일하는 중 오류가 발생했습니다.

static { 
    final List<Class<? extends A>> typeList = Arrays.asList(
     C.class, 
     D.class 
    ); 
} 

public interface A {…} 

public class C extends B {…} 

public class D extends B {…} 

public abstract class B implements A {…} 

안드로이드 스튜디오 불평과 위의 라인 final List…에 컴파일되지 않습니다 :

내가 클래스 내부의이 조각을 가지고 (의이 경우 1를 부르 자)

호환되지 않는 유형
필수 목록 < 클래스 <? 확장 A > >
발견 목록 < 클래스 <? 이전에이 코드를 가지고, B에게 > >

를 확장하지만 (의이 경우 2를 부르 자)는

static { 
    final List<Class<? extends A>> typeList = Arrays.asList(
     C.class, 
     D.class 
    ); 
} 

public interface A {…} 

public class C implements A {…} 

public class D implements A {…} 

및 컴파일합니다.

그래서, 난 그냥이에 경우 1을 변경하는 문제를 좁히는을 위해, 시도 :

static { 
    final List<Class<? extends A>> typeList = Arrays.asList(
     B.class 
    ); 
} 

는 B이 경우 두 단지 C와 D처럼 구현주의하시기 바랍니다. 그러나 컴파일러는 여전히 불평합니다.

이 문제를 이해하는 데 아이디어가 부족합니다. Java Language Specification 유형 및 값 장을 읽었지만 아무 것도 읽지 않습니다.

StackOverflow에서 검색 한 결과 비슷한 질문을 찾지 못했습니다.

모든 포인터? (추신 : 누군가가하기 전에 XKCD 필수)

+0

나를 위해 잘 컴파일하십시오. Java 7을 사용하는 경우 명시적인 형식 인수를 사용할 수 있습니다. –

+0

Sotiros Delimanolis, 실제로이 질문과 중복됩니다. 이전에 검색하는 데 잘못된 용어를 사용했습니다. –

답변

6

이 문제는 형식 유추의 문제입니다. Java 8 이전에는 컴파일러가 typeList 유형을 사용하여 Arrays.asList이라는 인스턴스를 결정할만큼 충분히 똑똑하지 않으므로 혼자서 발생했습니다.

이 명시 적 힌트를보십시오 :

final List<Class<? extends A>> typeList = Arrays.<Class<? extends A>>asList(
    B.class 
); 

더 자세히로 이동하려면, 컴파일러는 절연이보고 :

Arrays.asList(
    C.class, 
    D.class 
); 

이 할당 무엇을 보지 않고. Class<? extends A> 대신에 Class<? extends B>을 선택합니다. 이는 모든 인수에 공통되는 가장 구체적인 수퍼 유형이기 때문입니다.

+0

우와.좋은 것. – Mena

+0

그것은 완벽하게 작동했습니다! 당신은 빨리, 그래서 빨리 StackOverflow 나를 받아 들일 수 있도록 허용하지 않습니다! 마크 피터스 감사합니다. –

관련 문제