जावा अक्सर तर्कों के आधार पर जेनरिक का अनुमान लगा सकता है (और यहां तक कि वापसी प्रकार पर, उदाहरण के लिए सी #)।बदले में वाइल्डकार्ड जेनेरिक
बिंदु में मामला:
Pair<String, String> pair = Pair.of("Hello", "World");
विधि of
सिर्फ इस तरह दिखता है:
Pair<T1, T2>
जो सिर्फ मूल्यों की एक जोड़ी संग्रहीत करता है और निम्नलिखित तरीके से इस्तेमाल किया जा सकता है
public static <T1, T2> Pair<T1, T2> of(T1 first, T2 second) {
return new Pair<T1, T2>(first, second);
}
बहुत अच्छा। बहरहाल, यह नहीं रह गया है निम्नलिखित यूज-केस, जो वाइल्डकार्ड की आवश्यकता है के लिए काम करता है: (। सूचना स्पष्ट डाली List.class
सही प्रकार बनाने के लिए)
Pair<Class<?>, String> pair = Pair.of((Class<?>) List.class, "hello");
कोड प्रदान की निम्न त्रुटि (के साथ विफल ग्रहण से):
कोप्रकार बेमेल:
TestClass.Pair<Class<capture#1-of ?>,String>
से परिवर्तित नहीं कर सकतेTestClass.Pair<Class<?>,String>
हालांकि, स्पष्ट रूप से बुला निर्माता अभी भी काम करता है के रूप में उम्मीद:
Pair<Class<?>, String> pair =
new Pair<Class<?>, String>((Class<?>) List.class, "hello");
कोई इस व्यवहार की व्याख्या कर सकते हैं? क्या यह डिजाइन द्वारा है? क्या यह चाहता था? क्या मैं कुछ गलत कर रहा हूं या क्या मैं कंपाइलर में डिज़ाइन/बग में एक दोष पर ठोकर खा रहा हूं?
जंगली अनुमान: किसी भी तरह प्रकार एक Class<List>
बनाने, और इस तरह रूपांतरण (Pair<Class<?>, String>
से Pair<Class<List>, String>
करने के लिए) में नाकाम रहने, सूचित करते हैं कि वाइल्डकार्ड मक्खी पर संकलक द्वारा में भर जाता है लगता है? "1-के # कब्जा" । क्या यह सही है? क्या इस के आसपास काम करने का कोई तरीका है?
public final class Pair<T1, T2> {
public final T1 first;
public final T2 second;
public Pair(T1 first, T2 second) {
this.first = first;
this.second = second;
}
public static <T1, T2> Pair<T1, T2> of(T1 first, T2 second) {
return new Pair<T1, T2>(first, second);
}
}
ऐसा लगता है कि कनवर्टर "के" के हस्ताक्षर को देखता है क्योंकि यह एक जोड़ी देता है वर्ग बढ़ाता है,? वर्ग > प्रकार बढ़ाता है। अंतिम कक्षाओं के लिए यह विस्तारित भाग को कम करने के लिए पर्याप्त स्मार्ट लगता है, यही कारण है कि यह स्ट्रिंग पर शिकायत नहीं करता है। –
Zed
हम्म, दिलचस्प। मुझे यहां जोड़ने के लिए धन्यवाद। – jjnguy
अब यह जावा 8 में काम करता है। इनफ्रेंस के लिए लक्ष्य प्रकार से भी परामर्श लिया जाता है। – ZhongYu