2010-06-10 30 views
7

मैं जैसे निम्नलिखित वर्ग को परिभाषित करना चाहते हैं:क्या यह जावा में जेनेरिक के साथ एक सीमा है?

public class CollectionAttribute<E extends Collection<T>> { 
    private String name; 
    private E value; 
    public CollectionAttribute(String name, E value) { 
     this.name = name; 
     this.value = value; 
    } 

    public E getValue() { return value; } 

    public void addValue(T value) { value.add(T); } 
} 

यह संकलन नहीं होगा (cannot resolve symbol T)। यदि मैं निम्नलिखित के साथ कक्षा घोषणा को प्रतिस्थापित करता हूं:

public class CollectionAttribute<E extends Collection<?>> 

तब मैं संग्रह के पैरामीट्रिज्ड प्रकार का संदर्भ नहीं दे सकता।

क्या मुझे कुछ याद आ रहा है या क्या मैं जावा में जेनेरिक के साथ सीमा तक पहुंच गया हूं?

उत्तर

13

आप टी के लिए एक दूसरे सामान्य पैरामीटर जोड़ना:

public class CollectionAttribute<T, E extends Collection<T>> { 
    private String name; 
    private E values; 
    public CollectionAttribute(String name, E values) { 
     this.name = name; 
     this.values = values; 
    } 

    public E getValue() { return value; } 

    public void addValue(T value) { values.add(value); } 
} 

नाथन के रूप में बताया, तो आप भी नहीं value.add(T) लिख सकते हैं।

+0

: -o कोई भी संक्षिप्त स्पष्टीकरण क्यों? – OscarRyz

+0

@ समर्थन: अन्यथा, कोई 'टी' प्रकार नहीं है। – SLaks

+0

यह अनावश्यक नहीं है? अब जब मैं इस ऑब्जेक्ट को बनाता हूं तो मुझे अपने टी को दो बार निर्दिष्ट करना होगा :( –

7

आपकी उदाहरण कक्षा के साथ दो समस्याएं हैं। पहला यह है कि आपको टी का अर्थ घोषित करने की आवश्यकता है, जिसका अर्थ है कि इसे कक्षा के लिए जेनेरिक में शामिल किया जाना चाहिए, या एक वास्तविक वर्ग प्रकार होना चाहिए। इस मामले में, आप शायद चाहते

public class CollectionAttribute<T, E extends Collection<T>> 

दूसरी समस्या, यदि आपने पूर्व पहले संकलक मिल गया होता तो आप शायद पाया है | जो कि आपके addValue विधि के शरीर संग्रह करने के लिए प्रकार टी जोड़ने की कोशिश कर रहा है , उस मान के बजाय:

public void addValue(T value) { this.value.add(value); } 
संबंधित मुद्दे