溫馨提示×

java怎么獲取泛型T的class

小億
790
2024-01-13 14:00:46
欄目: 編程語言

在Java中,由于類型擦除的限制,無法直接獲取泛型類型的Class對象。但是,可以通過以下兩種方式來獲取泛型類型的Class對象:

  1. 通過傳遞一個Class參數(shù)來獲取泛型類型的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參數(shù)來獲取泛型類型的Class對象,并保存在一個成員變量中,然后通過getType方法來獲取該Class對象。

  1. 通過反射來獲取泛型類型的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方法獲取到實際的類型參數(shù)的Type對象數(shù)組,最后通過強制轉換為Class對象來獲取到泛型類型的Class對象。

需要注意的是,在使用第二種方式獲取泛型類型的Class對象時,必須在子類中實現(xiàn)一個無參的構造方法,否則會拋出ClassCastException異常。

0