2011-06-21 28 views
10

मैं एक अंतरफलक है कि एक तरीका है जिसके चीजें हैं जो लागू दोनों Comparator<Object> और Action, यानीप्रकार अनुमान वापसी प्रकार, वाइल्ड कार्ड, और चौराहे प्रकार

<T extends Comparator<Object> & Action> List<T> getThings(); 

यह की एक सूची प्रदान करेगा शामिल घोषित करने के लिए कोशिश कर रहा हूँ शामिल ठीक से संकलित करता है, लेकिन समस्या तब आती है जब मैं इस विधि को कॉल करने का प्रयास करता हूं।

incompatible types; no instance(s) of type variable(s) T exist so that 
java.util.List<T> conforms to java.util.List<javax.swing.Action> 
found : <T>java.util.List<T> 
required: java.util.List<javax.swing.Action> 

निम्नलिखित या तो काम नहीं करता है:

List<? extends Action> things = getThings(); 
List<? extends Comparator<Object>> things = getThings(); 
जब मैं मैं निम्नलिखित संकलन त्रुटि हो यह करने के लिए कोशिश

List<Action> things = getThings(); 
List<Comparator<Object>> things = getThings(); 

: मैं यह करने के लिए सक्षम होना चाहते हैं

इस प्रभाव को प्राप्त करने का एक और तरीका एक खाली इंटरफ़ेस बनाना है जो Comparator<Object> और Action दोनों को बढ़ाता है और इसे रिटर्न प्रकार के रूप में उपयोग करता है, यानी

public interface ComparatorAction extends Comparator<Object>, Action { } 
List<ComparatorAction> getThings(); 

लेकिन मैं ऐसा नहीं करना चाहता हूं। जो कुछ मैं चाहता हूं उसे करने का एक तरीका बनना है, है ना? कोई विचार?

धन्यवाद!

पीएस मुझे इस पोस्ट के लिए एक अच्छा शीर्षक के साथ आने में मुश्किल हो रही है, इसलिए इसे बदलने में संकोच न करें।

उत्तर

4

तुम भी विधि parameterize सकता है (रों) जिसमें से आप getThings() पर कॉल करते हैं। उदाहरण के लिए:

public static <U extends Comparator<Object> & Action> void main(String[] args) { 
    List<U> l = getThings(); 
    Action a = l.get(0); 
    Comparator<Object> c = l.get(0); 
} 
+0

यह वही है जो मुझे चाहिए, धन्यवाद! –

4
List<? extends Action> things = getThings(); 
List<? extends Comparator<Object>> things = getThings(); 

संपादित मेरी पहली प्रतिक्रिया थी कि। तब मैंने इसके बारे में सोचा और मुझे नहीं लगता कि अनुमान काम कर सकता है, इसलिए मैंने जवाब हटा दिया।

फिर से जांच की जांच, उन्हें काम करना चाहिए। यह जेडीके 7 में संकलित करता है, लेकिन जेडीके 6 में विफल रहता है। मुझे लगता है कि उन्होंने एक बग तय किया है जिसे उन्होंने तय किया है।

संपादित करें ... मैंने spec (JLS3 # 15.12.2.8) फिर से पढ़ा है, और अब मुझे नहीं लगता कि अनुमान काम करना चाहिए। जेडीके 6 अनुमान को खारिज करने में सही था। (मुझे संदेह है कि जेडीके 7 ने एक नई बग पेश की है; यह संभव है कि अनुमान नियम अपडेट हो जाएं, इसलिए नए नियमों के अनुसार जेडीके 7 सही है। मुझे यकीन नहीं है)

जेएलएस 3 के अनुसार, पहले एक वाइल्डकार्ड कैप्चर, एक नया प्रकार है पैरामीटर W पेश किया गया है, जिसमें ऊपरी बाउंड Action है। तो निष्कर्ष इन प्रारंभिक कमी है:

List<W> >> List<T> 
Comparable >> T 
Action >> T 

पहले बाधा उपज समानता बाधा T=W, और बस हो गया, अनुमान किया जाता है।

अब संकलक अगर अनुमानित T अपनी सीमा को संतुष्ट करता है देखने के लिए जाँच करेगा, भले ही

W :< Comparable 
W :< Action 

जवाब नहीं है, वह यह है कि, 1 बाध्य संतुष्ट नहीं हो सकता है। (IntelliJ एक अच्छा त्रुटि संदेश दिखाता है (जावैक से बेहतर): "इन्फ्रारेड टाइप '? एक्शन' (यानी।डब्ल्यू) टाइप पैरामीटर 'टी' के लिए इसकी सीमा के भीतर नहीं है; तुलनीय को लागू करना चाहिए ")

संपादित 3 सवाल। अगर वहाँ नहीं होना चाहिए, तो हम

List<? extends Action> >> List<T> 
Comparable >> T 
Action >> T 

है कि क्या वहाँ अनुमान से पहले एक वाइल्डकार्ड पर कब्जा किया जाना चाहिए। जो मेरे लिए स्पष्ट नहीं है जो पैदावार

T :< Action 
T :< Comparable 
इसलिए

T=Comparable & Action

+0

धन्यवाद का उपयोग कर सकते हैं! –

0

जब आप एक List<T> ऐसे ही लौटने के लिए, T कुछ (अज्ञात) को संदर्भित करता है टाइप कि Action और Comparator<Object> की एक उप-प्रकार है और एक (अधिमानतः न्यूनतम) आम ​​सभी के सुपर-प्रकार है सूची में तत्व। यदि ऐसा कोई प्रकार मौजूद नहीं है, तो आप शायद समस्याओं में भाग ले रहे हैं।

आप परवाह नहीं है तो क्या T है, आप एक प्रकार चर का उपयोग कर सकते डेव कोस्टा पता चलता है की तरह है, या आप अनुसंधान एवं स्पष्टीकरण के लिए वाइल्डकार्ड के

List<? extends Action> l = getThings(); 
List<? extends Comparator<Object>> l2 = getThings(); 
+0

आप सही दिखते हैं। (अपरिवर्तनीय के अनुसार, केवल जावा में <= 1.6)। – ILMTitan

+0

मेरी इच्छा है कि मैं ऐसा कर सकता हूं लेकिन स्पष्ट रूप से यह केवल जेडीके 7 में समर्थित है। @ अपरिवर्तनीय उत्तर देखें। –

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