আমি এটি করার একটি সাধারণ এবং সহজ উপায় পেয়েছি। আমার ক্লাসে আমি এমন একটি পদ্ধতি তৈরি করেছি যা শ্রেণীর সংজ্ঞায় তার অবস্থান অনুযায়ী জেনেরিক টাইপ প্রদান করে। আসুন এর মতো শ্রেণির সংজ্ঞাটি ধরে নেওয়া যাক:
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];
}
}