2012-04-19 11 views
7
से अधिक प्रकार का निष्कर्ष निकालते

मान लीजिए दो सूचियों के प्रसंस्करण के लिए मैं इस तरह एक सरल विधि है:जावा जेनेरिक्स: दो पैरामीटर

public static <B> void foo(List<B> list1, List<B> list2) { 
} 

और लगता है मैं इसे इस तरह कॉल करना चाहते हैं:

foo(ImmutableList.of(), ImmutableList.of(1)); 

यह जीता संकलित नहीं करें, क्योंकि javac यह समझने के लिए पर्याप्त नहीं है कि मैं इंटीग्रर्स की दो सूचियां बनाने की कोशिश कर रहा था। इसके बजाय, मैं लिखने के लिए है:

foo(ImmutableList.<Integer>of(), ImmutableList.of(1)); 

मैं कैसे foo की घोषणा पहले संस्करण दूसरा एक के रूप में भी काम करने के लिए अनुमति देने के लिए बदलना चाहिए?

+1

बहुत यकीन है कि यह 'foo()' की घोषणा को बदलकर नहीं किया जा सकता है। –

+0

असल में, यह 'जावैक' का मामला पर्याप्त नहीं है, यह आपके वास्तविक अर्थ है कि आप 'ImmutableList.of() 'से क्या मतलब रखते हैं। क्या होगा यदि '()' खाली सूची नहीं लौटा, लेकिन डिफ़ॉल्ट कन्स्ट्रक्टर के साथ बनाई गई 5 वस्तुओं से भरा एक सूची? यह केवल '() 'का आंतरिक है जो आपको बताता है कि यह मामला नहीं है, और यदि ऐसा हुआ तो' foo 'को' ऑब्जेक्ट 'की एक सूची और' इंटेगर 'की एक सूची मिल जाएगी। –

उत्तर

3

मुझे पूरा यकीन है कि जावा का प्रकार अनुमान एकीकरण को संभालने के लिए पर्याप्त शक्तिशाली नहीं है।

क्या आप किसी प्रकार की एक मध्यवर्ती वस्तु लौटने के लिए, और कॉल साइट को बदलने है कर सकता है की तरह कुछ होने के लिए:

foo(list1).and(list2) 

लेकिन तब यह अभी भी केवल इसलिए बाएं से दाएं अनुमान लगाने के लिए सक्षम हो जाएगा, आप के रूप में यह कॉल करने के लिए होगा:

foo(ImmutableList.of(1)).and(ImmutableList.of()); 
1

आपको लगता है कि बस पैरामीटर के सामान्य जानकारी बदल रहा है और द्वारा दोनों संस्करणों work.ie जाएगा कर सकते हैं

public static <B> void foo(List<? super B> list1, List<B> list2) { 


     } 

अब दोनों संस्करण काम करेंगे।

foo(ImmutableList.of(), ImmutableList.of(1)); 
foo(ImmutableList.<Integer>of(), ImmutableList.of(1)); 
+1

यह एक अच्छा विकल्प नहीं है यदि 'foo' वास्तव में' सूची 'से' बी 'पढ़ता है। – trutheality

2

एकमात्र सेटिंग जिसमें मैं इसे आपके लिए असुविधा महसूस करता हूं, जब आप इसे बहुत करते हैं। उस स्थिति में आप

private static final ImmutableList<Integer> EMPTYINTLIST = ImmutableList.<Integer>of(); 

और अपनी कॉल में अपने EMPTYINTLIST का उपयोग कर सकते हैं।

संबंधित मुद्दे