2011-08-17 9 views
5

मैं तीन जेनेरिक इंटरफेस (उनमें से दो के बीच एक प्रतिलोम रिश्ते के साथ) है और उन्हें एक पुनरावर्ती विधि में कार्रवाई करने के लिए करना चाहते हैं:Recursion और जेनेरिक इंटरफेस के साथ कार्य करना

public interface User<R extends Role<R,U>, U extends User<R,U>> 
{ 
    public R getRole(); 
    public void setRole(R role); 
} 

public interface Role<R extends Role<R,U>,U extends User<R,U>> 
{ 
    public List<R> getRoles(); 
    public void setRoles(List<R> roles); 

    public List<U> getUser() ; 
    public void setUser(List<U> user); 
} 

अब मैं एक साथ कुछ प्रसंस्करण क्या करना चाहते हैं मेरी Worker कक्षा में प्रत्यावर्तन:

public <R extends Role<R,U>,U extends User<R,U>> void recursion(List<R> roles) 
{ 
    for(R role : roles) 
    { 
    recursion(role.getRoles()); 
    } 
} 

मैं इस त्रुटि मिलती है और मैं कर रहा हूँ पता लगा नहीं था क्यों यह काम नहीं करता या मैं यह कैसे हल कर सकते हैं:

Bound mismatch: The generic method recursion(List<R>) of type Worker is not 
applicable for the arguments (List<R>). The inferred type User<R,User<R,U>> 
is not a valid substitute for the bounded parameter <U extends User<R,U>> 

उत्तर

2

मैंने जेनेरिक वाइल्डकार्ड ? का उपयोग किए बिना इसे संशोधित किया, इसलिए यह संकलित करता है।
अप्रासंगिक विधि घोषणाओं बाहर अलग करना समस्या का बाद:

public interface Role<R extends Role<R, U>, U extends User<R, U>> { 
    public List<Role<R, U>> getRoles(); // Change here to return type 
} 

public interface User<R extends Role<R, U>, U extends User<R, U>> { // No change 
} 

// Change to method parameter type 
public static <R extends Role<R, U>, U extends User<R, U>> void recursion(List<Role<R, U>> roles) { 
    for (Role<R, U> role : roles) { // Change to element type 
     recursion(role.getRoles()); 
    } 
} 

मुझे आशा है कि इन परिवर्तनों को अभी भी अपने डिजाइन फिट - मुझे पता है कि अगर वे आप के लिए काम नहीं करते और मैं अपनी आवश्यकताओं के आसपास काम करने की कोशिश करेंगे।

पुhew! मजबूत!

+0

मैं 'Role' के लिए इंटरफ़ेस विधि को बदलने के निहितार्थ के बारे में अनिश्चित हूँ। मुझे लगता है कि यह 'रोल' के इंटरफ़ेस की एक सूची देता है। मैं कुछ '@ इकाई' कार्यान्वयन के लिए इंटरफेस का उपयोग कर रहा हूं। रिकर्सिव विधि का उपयोग एक उपयोगिता वर्ग में किया जाता है, शायद डेकवे के वाइल्डकार्ड प्रस्ताव '?' मेरे लिए उपयुक्त है। – Thor

2

जैसा कि आपने देखा है कि आपको तर्कों में से एक में U टाइप करना होगा। आप ऐसा कर सकते हैं या आप ? बजाय उपयोग कर सकते हैं अगर आप U प्रकार अनदेखा करना चाहते:

public <R extends Role<R,?>> void recursion(List<R> roles) 
{ 
    for(R role : roles) 
    { 
    recursion(role.getRoles()); 
    } 
} 
+0

धन्यवाद, यह मेरे लिए समस्या का समाधान हो सकता है। लेकिन आम तौर पर मैं केवल वाइल्डकार्ड '?' का उपयोग करता हूं अगर मैं वास्तव में इस प्रकार को नहीं जानता। यहां मुझे यकीन है कि यह टाइप 'यू' है। – Thor

+0

फिर आप उस "प्रकार की जानकारी" के साथ एक और पैरामीटर पारित कर सकते हैं, उदाहरण के लिए: '... रिकर्सन (सूची भूमिकाएं, कक्षा उपयोगकर्ता क्लास)' (और पैरामीटर को अनदेखा करें) .. – dacwe

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