2016-06-27 2 views
1

는 내가 Guava documentationIKnowMyType에 표시로 TypeToken를 사용하여 런타임에 유형 매개 변수를 검색을 시도하고있다 :이 코드를 실행하면TypeToken을 사용하여 형식 매개 변수를 가져 오는 방법은 무엇입니까?

public class Test<E extends Enum<E>> { 

    private static enum MyEnum { 
     FIRST, 
     SECOND 
    }; 

    private final TypeToken<E> enumType = new TypeToken<E>(getClass()) { 
    }; 

    public static void main(String[] args) { 
     Test<MyEnum> container = new Test<>(); 
     System.out.println(container.enumType.getRawType()); 
    } 
} 

, 내가 출력으로 class java.lang.Enum를 얻을. 대신 class MyEnum을 얻지 못하는 이유는 무엇입니까?

답변

5

이 "hack"은 런타임 유형 Test의 값에서 작동하지 않습니다. 선언

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) { 
}; 

따라서 TypeToken까지 여기

Test<MyEnum> container = new Test<>(); 

당신의 Test 클래스를 인스턴스화 할 때 자바 추론 유형 인수를 전달할 수있는 방법이 없습니다

아무 생각이 없습니다 무엇 E해야 인용하다.

Javadoc 상태

구축해 T 새로운 유형 토큰 자유 형태 변수 declaringClass의 맥락에서 해결있다.

클라이언트는 빈 익명 하위 클래스를 만듭니다. 이렇게하면 매개 변수가 익명 클래스의 유형 계층 구조에 포함되므로 을 지우지 만 런타임에 다시 구성 할 수 있습니다.

그래서해야 할 일입니다. 클래스가 일반 슈퍼 클래스에 대한 정보를 유지하기 때문에

Test<MyEnum> container = new Test<MyEnum>() { 
}; 

는 지금의 TypeToken 인스턴스의 getClass 호출은 위의 EMyEnum로 해석 될 수있는 충분한 환경을 제공합니다.

+0

나는 이해할 수 없다. 답안에 '샘플'은 무엇을 의미합니까? 'Sample extends Test' 하위 클래스를 만들어야한다고 말하면서'Sample.enumType'을 찾을 수 있을까요? – Gili

+0

@Gili 죄송합니다. 테스트 클래스를 사용하고있었습니다. 'Sample'은'Test'입니다. 'Test'의 익명 서브 클래스를 생성합니다. –

+0

그게 작동합니다. 감사합니다! :) – Gili