मेरे पास पैरामीटरयुक्त इंटरफ़ेस है जो कई अलग-अलग तरीकों से लागू किया गया है। रन टाइम पर मुझे पता लगाना चाहिए कि एक मनमानी ऑब्जेक्ट दिया गया है जो इंटरफ़ेस को लागू करता है, इंटरफ़ेस के वास्तविक प्रकार पैरामीटर क्या हैं।परोक्ष रूप से लागू जेनेरिक इंटरफ़ेस के लिए वास्तविक प्रकार के तर्क कैसे प्राप्त करें?
यहाँ समस्या को वर्णन करने के एक टुकड़ा है, और एक आधे रास्ते इसे हल करने का प्रयास (also on ideone.com) है:
import java.util.*;
import java.lang.reflect.*;
interface Awesome<X> { }
class Base<E> implements Awesome<Set<E>> { }
class Child extends Base<List<Integer>> { }
class AwesomeExample {
public static void main(String[] args) {
Awesome<Set<List<Integer>>> x = new Child();
System.out.println(
((ParameterizedType)
Child.class.getGenericSuperclass()
).getActualTypeArguments()[0]
);
// prints "java.util.List<java.lang.Integer>"
System.out.println(
((ParameterizedType)
Base.class.getGenericInterfaces()[0]
).getActualTypeArguments()[0]
);
// prints "java.util.Set<E>"
investigate(x);
// we want this to print "Set<List<Integer>>"
}
static void investigate(Awesome<?> somethingAwesome) {
// how to do this?
}
}
ऐसा लगता है जैसे वहाँ कार्यावधि में काफी सामान्य प्रकार की जानकारी निकालना कि:
Child extends Base<List<Integer>>
Base<E> implements Awesome<Set<E>>
और इसलिए हम सभी बिट और टुकड़ों को एक साथ कि समाप्त करने के लिए रख सकते हैं:
Child implements Awesome<Set<List<Integer>>>
तो ऐसा लगता है कि समस्या की तरह व्याख्या करने योग्य है, लेकिन यह इतना आसान नहीं है, क्योंकि हम चाहते हैं एक मनमाना वर्ग/इंटरफेस पदानुक्रम के साथ काम करने के लिए। क्या यह ऐसा करने का एकमात्र तरीका है? क्या कोई आसान तरीका है? क्या किसी ने पहले से ऐसा करने के लिए पुस्तकालय लिखा है?
मुझे ऐसी लाइब्रेरी से अवगत नहीं है जो इसे लागू करता है। मैंने इसे स्वयं किया - और यह बहुत सुखद नहीं था। मुझे कम से कम एक सुपर प्रकार टोकन कार्यान्वयन मिल सकता है: http://code.google.com/p/google-gson/source/browse/trunk/src/main/java/com/google/gson/reflect/TypeToken.java ? आर = 60 और spec = svn89 –