Java 제네릭 - 클래스 가져오기?
이렇게 프로그램된 목록이 있어요public class MyList<T>
T 변수를 사용하여 클래스 이름을 가져올 수 있는 방법이 있습니까?MyList
T가 String, Socket 등인지 알고 계십니까?
EDIT: 아니요, 여기서 답을 찾았습니다.
간단한 답변:그럴수는 없어요.
장황한 답변:
범용 타입 T는 Java에서 구현되는 방식 때문에 런타임에 유지되지 않습니다.단, 개인 데이터 멤버를 사용할 수 있습니다.
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로 변환됩니다.이것은 raw 타입이라고 불립니다.raw 타입은 타입 인수가 없는 범용 클래스 또는 인터페이스 이름입니다.즉, 일반 클래스가 런타임에 사용하는 개체 유형을 찾을 수 없습니다.
이것이 모든 경우에 적용되는지 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.java의 두 가지 기능이 필요합니다.
상세한 것에 대하여는, http://www.artima.com/weblogs/viewpost.jsp?thread=208860 를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/4837190/java-generics-get-class
'source' 카테고리의 다른 글
바이트를 킬로바이트, 메가바이트, 기가바이트로 포맷 (0) | 2022.09.05 |
---|---|
필터 메서드 내부의 vue 인스턴스/데이터 액세스 (0) | 2022.09.05 |
안드로이드로 파일 복사하는 방법? (0) | 2022.09.05 |
MySQL 오류: 키 길이가 없는 키 지정 (0) | 2022.09.05 |
MariaDB는 여러 서브쿼리가 있는 여러 행에 "삽입" (0) | 2022.09.05 |