How to use TypeToken to get type parameter?을 추적하면 팩토리 메서드를 사용하여 클래스를 인스턴스화하면 TypeToken
은 더 이상 제네릭 형식 매개 변수를 캡처 할 수 없습니다.팩토리 메서드가 사용되는 경우 TypeToken이 제네릭 형식을 캡처하지 못하는 이유는 무엇입니까?
import com.google.common.reflect.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<MyEnum>() {
};
System.out.println("constructor: " + container.enumType.getRawType());
System.out.println("factory : " + build(MyEnum.class).enumType.getRawType());
}
public static <E extends Enum<E>> Test<E> build(Class<E> type) {
return new Test<E>() {
};
}
}
위 예제의 출력 :
constructor: class Test$MyEnum
factory : class java.lang.Enum
는 왜이 작품과는이 고정 될 수 있는가?
다시 입력하십시오. 'build' 호출에 대해 유추되는'MyEnum' 유형은 메소드 구현 내부로 전달되지 않습니다. 익명 클래스는 타입 변수 'E'로 매개 변수화됩니다. 그것은 런타임에 그 사실을 알 수있는 전부입니다. (그리고 그것의 범위입니다.) –
'Test'의 생성자에 type 매개 변수의 클래스 유형을 전달하고'TypeToken.of (cls)'를 사용하여 클래스 유형에서 직접'enumType'에 대한'TypeToken'을 구성 할 수 있습니다. – msandiford
@SotiriosDelimanolis이 답변을 회신 메일로 보내 주시면 (해결 방법이 있음) 언제든지 허용으로 표시하겠습니다. – Gili