Type erasure은 실행시에 개체의 제네릭 형식에 대한 정보가 존재하지 않는다는 것을 의미합니다.
(링크는 가능하면 객체의 유형에 정말 관심이있어, 자바 제네릭 : 그러나
에 대해 질문을 할 수있어 거의 모든 질문에 대답해야 안젤리카 랭의 Java Generics FAQ의 관련 섹션입니다 - 필드의 유형에 관심이 있습니다. 내가 질문을 오해하고, 대답은 인정되었지만 필드 유형 매개 변수 자체를 사용하지 않는 경우 나는 그것을 할 수있는 지금 고정 :)
을하여 보상 할 수 있도록 노력하겠습니다. 예를 들어 : 필드가 필드 List<T>
인과 클래스 T
에 있다면
는
import java.lang.reflect.*;
import java.util.*;
public class Test
{
public List<String> names;
public static void main(String [] args)
throws Exception // Just for simplicity!
{
Field field = Test.class.getDeclaredField("names");
ParameterizedType type = (ParameterizedType) field.getGenericType();
// List
System.out.println(type.getRawType());
// Just String in this case
for (Type typeArgument : type.getActualTypeArguments())
{
System.out.println(" " + typeArgument);
}
}
}
다음 컬렉션에 대한 형식 인수를 알기 위해 인스턴스에 대한 형식 인수를 알아야 할 것입니다. 당신의 필수 코드로이 번역
하지만 다소 까다 롭습니다 - 당신이 정말로 컬렉션 클래스의 시점에서 형식 인수를 알아야합니다.
public class StringCollection implements Collection<String>
을 다음 유형 StringCollection
의 필드 자체가 모든 유형의 인수를하지 않았을 해당 필드를했다 : 예를 들어, 누군가가 선언했다. 그런 다음 원하는 것을 찾을 때까지 getGenericSuperType
과 getGenericInterfaces
을 반복적으로 확인해야합니다.
정말 가능, 비록 그렇게 쉽지 않을거야. 내가 너라면 너의 디자인을 바꿔서 너가 필요 없다고 생각해.
나는 비슷한 문제에 직면했다. 그리고 이것은 마침내 나를 위해 그것을 해결했다 : http://stackoverflow.com/a/183232/639119 – Zds