Java 제네릭-클래스 가져 오기?
이 질문에 이미 답변이 있습니다.
- 제네릭 유형 T 19 답변 의 클래스 인스턴스를 얻는 방법
다음과 같이 프로그래밍 된 목록이 public class MyList<T>
있습니다. T 변수를 사용하여 클래스 이름을 가져 오는 방법이 있습니까? (내 MyList
에서 T가 String, Socket 등인지 알 수 있습니다 )?
편집 : 신경 쓰지 마세요, 여기 에서 답을 찾았습니다 .
짧은 대답 : 할 수 없습니다.
긴 대답 :
제네릭이 Java에서 구현되는 방식으로 인해 제네릭 유형 T는 런타임에 유지되지 않습니다. 그래도 개인 데이터 멤버를 사용할 수 있습니다.
public class Foo<T>
{
private Class<T> type;
public Foo(Class<T> type) { this.type = type; }
}
사용 예 :
Foo<Integer> test = new Foo<Integer>(Integer.class);
나는 해결책을 좋아한다
http://www.nautsch.net/2008/10/28/class-von-type-parameter-java-generics/
public class Dada<T> {
private Class<T> typeOfT;
@SuppressWarnings("unchecked")
public Dada() {
this.typeOfT = (Class<T>)
((ParameterizedType)getClass()
.getGenericSuperclass())
.getActualTypeArguments()[0];
}
...
Type Erasure 의 결과를보고 계십니다 . 그 페이지에서 ...
제네릭 유형이 인스턴스화되면 컴파일러는 유형 삭제라는 기술 (컴파일러가 클래스 또는 메서드 내의 유형 매개 변수 및 유형 인수와 관련된 모든 정보를 제거하는 프로세스)을 통해 이러한 유형을 변환합니다. 유형 삭제를 사용하면 제네릭을 사용하는 Java 애플리케이션이 제네릭 이전에 생성 된 Java 라이브러리 및 애플리케이션과의 바이너리 호환성을 유지할 수 있습니다.
예를 들어 Box <String>은 원시 유형이라고하는 Box 유형으로 변환됩니다. 원시 유형은 유형 인수가없는 일반 클래스 또는 인터페이스 이름입니다. 즉, 제네릭 클래스가 런타임에 어떤 유형의 Object를 사용하고 있는지 알 수 없습니다.
이것은 또한 꽤 좋은 대답 이있는 이 질문 처럼 보입니다 .
이것이 모든 경우에 작동하는지 100 % 확실하지 않습니다 (적어도 Java 1.5가 필요함).
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class Main
{
public class A
{
}
public class B extends A
{
}
public Map<A, B> map = new HashMap<Main.A, Main.B>();
public static void main(String[] args)
{
try
{
Field field = Main.class.getField("map");
System.out.println("Field " + field.getName() + " is of type " + field.getType().getSimpleName());
Type genericType = field.getGenericType();
if(genericType instanceof ParameterizedType)
{
ParameterizedType type = (ParameterizedType) genericType;
Type[] typeArguments = type.getActualTypeArguments();
for(Type typeArgument : typeArguments)
{
Class<?> classType = ((Class<?>)typeArgument);
System.out.println("Field " + field.getName() + " has a parameterized type of " + classType.getSimpleName());
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
그러면 다음이 출력됩니다.
필드 맵의 유형 맵
필드 맵의 매개 변수화 된 유형 A
필드 맵의 매개 변수화 된 유형 B
이런 식으로 일반 유형의 클래스를 얻을 수 있습니다.
class MyList<T> {
Class<T> clazz = (Class<T>) DAOUtil.getTypeArguments(MyList.class, this.getClass()).get(0);
}
이 파일에는 http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil의 두 가지 함수가 필요합니다 . 자바
자세한 설명 : http://www.artima.com/weblogs/viewpost.jsp?thread=208860
참고 URL : https://stackoverflow.com/questions/4837190/java-generics-get-class
'IT TIP' 카테고리의 다른 글
현재 선택된 항목을 유지하면서 Html Select의 옵션을 값별로 정렬하는 가장 효율적인 방법은 무엇입니까? (0) | 2020.10.15 |
---|---|
DB의 모든 테이블, 행 및 열에서 문자열 검색 (0) | 2020.10.15 |
ARC-__unsafe_unretained의 의미? (0) | 2020.10.15 |
Rabbitmq 관리를 위해 사용자를 재설정하는 방법 (0) | 2020.10.15 |
Python 3에서 사용자 지정 비교 함수를 사용하는 방법은 무엇입니까? (0) | 2020.10.14 |