मुझे ऐसा करने का एक सामान्य और सरल तरीका मिला। मेरी कक्षा में मैंने एक ऐसी विधि बनाई जो सामान्य परिभाषा को वर्ग परिभाषा में स्थिति के अनुसार लौटाती है। आइए इस तरह एक वर्ग की परिभाषा मानें:
public class MyClass<A, B, C> {
}
अब प्रकारों को बनाए रखने के लिए कुछ विशेषताएँ बनाते हैं:
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)
}
फिर आप एक जेनेरिक विधि बना सकते हैं जो जेनेरिक परिभाषा के सूचकांक के आधार पर प्रकार लौटाता है:
/**
* 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];
}
अंत में, कंस्ट्रक्टर में विधि को कॉल करें और प्रत्येक प्रकार के लिए सूचकांक भेजें। पूरा कोड इस तरह दिखना चाहिए:
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];
}
}