2016-07-08 16 views
5

में "सुपर" कीवर्ड के साथ क्या गलत है, मुझे मेरी परियोजना में एक अजीब समस्या का सामना करना पड़ा। अब मैं इस समस्या को सरल बनाया और यहाँ एक छोटा सा उदाहरण लिखा मेरा भ्रम वर्णन करने के लिए किया है:जावा जेनेरिक प्रकार

public class Question { 
    class Q1 {} 

    class Q2 extends Q1 {} 

    interface In<T> { 
     void f(T t); 
    } 

    List<Q2> list; 

    void f(In<? super List<? super Q2>> in) { 
     in.f(list); 
    } 

    static void g() { 
     Question question = new Question(); 
     In<Collection<Q1>> in1 = new In<Collection<Q1>>() { 
      @Override 
      public void f(Collection<Q1> o) {} 
     }; 
     In<List<Q2>> in2 = new In<List<Q2>>() { 
      @Override 
      public void f(List<Q2> o) {} 
     }; 
     question.f(in1); //Error! 
     question.f(in2); //Error! 
    } 
} 

मेरा उद्देश्य विधि f(In<? super List<? super Q2>>) अधिक लचीला बनाने के लिए है। मैं विधि में in1 या in2 पास कर सकता हूं। लेकिन न तो पारित किया जा सकता है! गलत क्या है?

शायद this answer कुछ समझ में आएगा। लेकिन मेरा सवाल अलग है !!! मेरा सामान्य प्रकार In<? super List<? super Q2>> है, जो सामान्य प्रकार के भीतर एक सामान्य प्रकार है।

+0

@ एंडी टर्नर "सबकुछ मेल खाता है? सुपर क्यू 2" तो क्यों 'question.f (in1)' त्रुटि है? क्या आप और साफ़ कर सकते हैं? – Jerry06

+0

@ जेरी06 मुझे लगता है कि मैंने इस सवाल का गलत व्याख्या किया था। फिर से खोल दी। –

उत्तर

0
In<Collection<? extends Q1>> in1 = new In<Collection<? extends Q1>>() { 
      @Override 
      public void f(Collection<? extends Q1> o) {} 
     }; 
     In<List<? extends Q2>> in2 = new In<List<? extends Q2>>() { 
      @Override 
      public void f(List<? extends Q2> o) {} 
     }; 
+0

'विस्तार' अलग है। यह आसान है। कृपया इसे 'सुपर' में बदलें और देखें कि क्या होता है। –

+0

हां। सुपर – Gangadhar

2

रूप A<? extends B> की एक सामान्य प्रकार का मतलब है कि ?B या B के किसी भी सुपर प्रकार के आधार पर बदला जा सकता है। इस प्रकार, List<? super Q2> का अर्थ कुछ है: या तो List<Object>, List<Q1> या List<Q2>

हालांकि Q1 एक सुपर-प्रकार Q2 है, List<Q1>List<Q2> का सुपर-प्रकार नहीं है। इसका मतलब है कि List<Object>, List<Q1> और List<Q2> का एकमात्र सामान्य सुपर-प्रकार Object है। तो एकमात्र चीज जिसे आप अपने f विधि में पास कर सकते हैं वह In<Object> है।

आपको इसे हल करने की आवश्यकता कैसे है आपको वास्तव में क्या लचीलापन की आवश्यकता है: आप किस प्रकार की वस्तुओं को f पर पास करना चाहते हैं और उन वस्तुओं के साथ क्या करना चाहते हैं?

+0

के साथ वही त्रुटि '> 'बढ़ाता है? और अगर मैं 'संग्रह' के किसी भी उप-वर्ग को' f' पास करना चाहता हूं तो मुझे क्या करना चाहिए? –

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