在Java中,由于類型擦除的限制,無法直接獲取泛型類型的Class對象。但是,可以通過以下兩種方式來獲取泛型類型的Class對象:
public class MyClass<T> {
private Class<T> type;
public MyClass(Class<T> type) {
this.type = type;
}
public Class<T> getType() {
return type;
}
}
// 使用示例
MyClass<String> myClass = new MyClass<>(String.class);
Class<String> stringClass = myClass.getType();
在上面的示例中,通過在構造方法中傳遞一個Class參數來獲取泛型類型的Class對象,并保存在一個成員變量中,然后通過getType方法來獲取該Class對象。
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class MyClass<T> {
public Class<T> getType() {
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
Type[] actualTypeArguments = paramType.getActualTypeArguments();
return (Class<T>) actualTypeArguments[0];
}
}
// 使用示例
MyClass<String> myClass = new MyClass<String>();
Class<String> stringClass = myClass.getType();
在上面的示例中,通過使用反射,可以獲取到泛型類型的Class對象。首先通過getClass方法獲取當前對象的Class對象,然后通過getGenericSuperclass方法獲取該Class對象的父類的Type對象,接著判斷該Type對象是否為ParameterizedType類型,如果是的話,通過getActualTypeArguments方法獲取到實際的類型參數的Type對象數組,最后通過強制轉換為Class對象來獲取到泛型類型的Class對象。
需要注意的是,在使用第二種方式獲取泛型類型的Class對象時,必須在子類中實現一個無參的構造方法,否則會拋出ClassCastException異常。