2014-10-22 4 views
2

일반 정적 메서드가 있고 삽입 된 실제 제네릭 형식의 클래스 개체를 반환 할 싶습니다.정적 메서드에서 실제 제네릭 형식의 클래스 개체 가져 오기

나는이처럼 시도 :

@SuppressWarnings("unchecked") 
public static <T> Class<T> getClassType() { 

    Method thisMethod; 
    try { 
     thisMethod = CommonTools.class.getMethod("getClass", new Class<?>[0]); 
    } catch (Exception ex) { 
     //ErrorLog.error(ex.getMessage(), ex); 
     return null; 
    } 

    Type returnType = thisMethod.getGenericReturnType(); 
    Type tType = returnType.getClass().getGenericSuperclass(); 
    ParameterizedType parameterizedType = (ParameterizedType) tType; 
    Class<T> clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0]; 

    return clazz; 
} 

이에 대한 나의 영감이 거기에, 구글 코드 모르핀 라이브러리에서 발견 그들은이 같은 것을 사용하고 있습니다 :

(((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0])) 

내 코드의 차이 그리고 그 코드는 클래스에서 제네릭 타입을 찾기 위해 그것을 호출한다는 것입니다 - 메소드에서 사용되기를 바랍니다.

내 코드가 작동하지 않고 클래스 변환 라인에 속합니다.

정적 메서드에서 현재 제네릭 형식을 가져 오는 방법에 대한 아이디어가 있습니까?

감사합니다.

+0

왜 이 2 회인가 public static이어야합니다. 내가 잘못하지 않은 경우 getClassType(). –

+0

그리고 T가 제네릭 매개 변수라는 것을 알기보다는 메서드가 어떻게해야합니까? – ondra

+0

를 사용하여 클래스 패밀리를 만들 수 있다고 생각합니다. 또한 팩토리를 작성하고 부모 클래스에 유형 enum을 부여하고 팩토리를 사용하여 클래스를 전달 된 enum 값을 기반으로 특정 유형으로 변환 할 수 있습니다. –

답변

0

감사합니다. 메서드 getClass을 얻습니다. 반환 형식은 기본적으로 Class<CommonTools>이고 그 뒤에 이 호출됩니다.이 경우 Class<CommonTools>이 반환됩니다. TypeArgument는 CommonTools이기 때문입니다.

Class<CommonTools> ct = getClassType();으로 전화를 걸면 작동하지만 그와 같은 정보는 없습니다.

JVM이 런타임에 모든 일반 정보를 지우기 때문에 정보를 얻을 수있는 방법이 없다는 것을 알고 있습니다. 가장 간단한 해결책은 CommonTools이 인스턴스 생성시 Class<T> 인스턴스를 가져 와서 반환하지만 너무 일반적이지 않다는 것입니다.

+0

괜찮습니까. 그래서 Java에서 메서드의 런타임에 제네릭 형식을 알 수 없습니까? – ondra

+0

예, 여기를 참조하십시오. http://docs.oracle.com/javase/tutorial/java/generics/erasure.html 및 여기 http://stackoverflow.com/questions/9548779/java-generics-accessing-generic-type -at-runtime –

+0

감사합니다 ................. – ondra

관련 문제