2011-09-28 4 views
4

내가 정의 된 메소드가있는 경우.왜이 상황에서 캐스트가 필요합니까?

public static <T> T getSomeTea(Class<T> returnType) { 
    //do stuff and return a T 
} 

public static <T> T getSomeSpecialTea(T someVal) { 
    T someTea = (T) getSomeTea(someVal.getClass()); 
} 

getSomeSpecialTea에서 getSomeTea의 반환 값을 왜 캐스팅해야합니까? 캐스트가 불필요한 것처럼 보일 수도 있지만, 아마도 중요한 것을 놓치고있을 것입니다.

답변

4

Object.getClass() 제네릭되지 않으므로 코드는 효율적이다 : 당신이 캐스트가 필요한 이유를 그 시점에서

public static <T> T getSomeSpecialTea(T someVal) { 
    Class<?> clazz = someVal.getClass(); 
    T someTea = (T) getSomeTea(clazz); 
} 

는 그것을 명확? (캐스트가 실제로 실행 시간에 아무 것도 없을 것입니다 ...) 당신은 실제로 <T>getSomeTea()이라고 부르지 않고을 효과적으로 수행하기를 원합니다.

그것은

1

getClass() 그 버그가 많은 사람들의 반환 형식에 불행한 삭제.

당신은을 반환하는 유틸리티 메소드를 가질 수 있습니다 고통 :(조금되는 자바 제네릭의 또 다른 사건 소제되지 않은 유형

public static <T> Class<? extends T> myGetClass(T instance) 
    return (Class<? extends T>)instance.getClass(); 

public static <T> T getSomeSpecialTea(T someVal) 
    T someTea = getSomeTea(myGetClass(someVal)); 
관련 문제