2010-02-16 2 views
5

Java에서 유형 삭제 처리와 관련된 대부분의 문서는 유스 케이스가 SomeType<ParamType>과 같은 유형을 처리한다고 가정합니다. 나는 다음과 같은 방법에 대한 방법 매개 변수를 처리하기 위해 노력하고 있어요 : 컨테이너 클래스 타입 DvQuantity 인스턴스화되면Java : 중첩 된 매개 변수화 된 유형 (내부)에서 내부 유형 가져 오기

public void setOtherReferenceRanges(List<ReferenceRange<T>> referenceRanges) 

는,이 서명은 런타임에서 public void setOtherReferenceRanges(List<ReferenceRange<DvQuanitity>> referenceRanges) 될 것이다. ListReferenceRange<T>actualTypeArgument을 가지고 있음을 알 수 반사를 사용

. 리플렉션이 클래스 정보를 사용하기 때문에, 나는 그것이 내게 ReferenceRange<DvQuantity>을 줄 것으로 기대하지 않을 것이다. 그러나이 메서드가 포함 된 클래스를 만들 때 형식을 T으로 전달했습니다. 따라서 T에 채워지는 유형은 Java 런타임에서 사용할 수 있어야하지만 가져 오는 방법을 찾지 못했습니다. 리플렉션을 통해 액세스 한 TypeVariableImpl 개체로 끝나는데 이는 유용한 데이터가없는 것으로 보입니다.

런타임에이 정보를 찾을 수있는 방법이 있습니까?

답변

1

당신은 내가이 방법

난 당신이 예를 들어, 해당 유형의 객체를 생성 할 때이 말은 추측을 포함하는 클래스를 생성

말할 때 :

foo = new ContainerClass<DvQuantity>(); 

이 경우 지우 기 때문에 유형 DvQuantity을 복구 할 수있는 방법이 없습니다.

그러나, 당신은 거의 첫 번째 예처럼하지만 미묘한으로 보이는 (이

class DvQuantityContainerClass extends ContainerClass<DvQuantity> {...} 
... 
foo = new DvQuantityContainerClass(); 

또는 짧은, 인라인 익명의 서브 클래스처럼, 슈퍼 클래스에 형식 매개 변수를 전달하는 클래스를 만드는 경우 그러나 중요한 차이는 다음과 같습니다.

런타임시 수퍼 클래스를 확장하는 데 사용되는 유형 매개 변수를 복구하므로 유형 매개 변수를 복구 할 수 있습니다. 불행하게도, 자바 자체는 지금에 가득 TDvQuantityContainerClass.setOtherReferenceRanges 방법의 종류를 얻을 수있는 쉬운 방법을 제공하지 않는 경우, 나는 일반적인 유형의 고급 반사를 할, gentyref를 작성했습니다.

Method m = DvQuantityContainerClass.class.getMethod("setOtherReferenceRanges", List.class); 
// this will return List<ReferenceRange<DvQuanity>>, like you are lookingn for 
return GenericTypeReflector.getExactParameterTypes(m, DvQuantityContainerClass.class) 
+0

응답 해 주셔서 감사합니다. 지금까지 내가 본 것을 검증합니다. 불행히도 나는이 작업을하기 위해 필요한 설정에 대한 권한이 없습니다. 또한 다른 응답 덕택에 상황을 제어 할 수 있다면 유용 할 것입니다. – mahonya

0

일반 유형 정보는 erased by the compiler이며 런타임에는 사용할 수 없습니다. 내가 클래스 인수를 전달 런타임에 특정 유형을 확인해야 할 때 :

public <T> void doSomething(T t, Class<T> c); 

이 항상 편리하거나 불가능하지만 많은 경우 것이 가능하다.

0

T를 채우는 형식은 Java 런타임에서 사용할 수 있어야하지만 가져 오는 방법을 찾지 못했습니다.

아마도 그것이 완전히 올바르지는 않지만 런타임시에는 실제 클래스가 없습니다. 즉 T의 인터페이스를 충족시키는 특정 유형이없는 객체입니다. 즉, 삭제가 발생하지 않습니다. (OOP 세계에서는 적어도) 이런 종류의 것들을 사용하는 것입니다.

http://java.sun.com/docs/books/tutorial/java/generics/erasure.html

는 클래스 자체 내부 유형 정보 (T 유형 메소드 getUnderlyingType() ... 또는 뭔가를 필요)를 캡처하는 방법이 있습니다,하지만 그건 잘못된 생각이다. 객체의 원시 타입을 정말로 필요로한다면 generics를 사용하여 다시 생각해 볼 것입니다.