Tôi tìm thấy một cách chung chung và đơn giản để làm điều đó. Trong lớp của tôi, tôi đã tạo ra một phương thức trả về kiểu chung theo vị trí của nó trong định nghĩa lớp. Hãy giả sử một định nghĩa lớp như thế này:
public class MyClass<A, B, C> {
}
Bây giờ hãy tạo một số thuộc tính để duy trì các loại:
public class MyClass<A, B, C> {
private Class<A> aType;
private Class<B> bType;
private Class<C> cType;
// Getters and setters (not necessary if you are going to use them internally)
}
Sau đó, bạn có thể tạo một phương thức chung trả về kiểu dựa trên chỉ mục của định nghĩa chung:
/**
* Returns a {@link Type} object to identify generic types
* @return type
*/
private Type getGenericClassType(int index) {
// To make it use generics without supplying the class type
Type type = getClass().getGenericSuperclass();
while (!(type instanceof ParameterizedType)) {
if (type instanceof ParameterizedType) {
type = ((Class<?>) ((ParameterizedType) type).getRawType()).getGenericSuperclass();
} else {
type = ((Class<?>) type).getGenericSuperclass();
}
}
return ((ParameterizedType) type).getActualTypeArguments()[index];
}
Cuối cùng, trong hàm tạo, chỉ cần gọi phương thức và gửi chỉ mục cho từng loại. Mã hoàn chỉnh sẽ trông như sau:
public class MyClass<A, B, C> {
private Class<A> aType;
private Class<B> bType;
private Class<C> cType;
public MyClass() {
this.aType = (Class<A>) getGenericClassType(0);
this.bType = (Class<B>) getGenericClassType(1);
this.cType = (Class<C>) getGenericClassType(2);
}
/**
* Returns a {@link Type} object to identify generic types
* @return type
*/
private Type getGenericClassType(int index) {
Type type = getClass().getGenericSuperclass();
while (!(type instanceof ParameterizedType)) {
if (type instanceof ParameterizedType) {
type = ((Class<?>) ((ParameterizedType) type).getRawType()).getGenericSuperclass();
} else {
type = ((Class<?>) type).getGenericSuperclass();
}
}
return ((ParameterizedType) type).getActualTypeArguments()[index];
}
}