यह एक उदाहरण है जिसे मैंने अपने असली कोड का सरलीकरण करने के लिए बनाया है, इसलिए अगर मैं थोड़ा सा प्रतिस्पर्धा करता हूं तो मैं क्षमा चाहता हूं। मैं क्या करना चाहता हूं प्रभावी रूप से एक ही नेस्टेड प्रकार तर्क से दो प्रकार के पैरामीटर प्राप्त करना है। मुझे यकीन है कि यह असंभव है, लेकिन मैंने सोचा कि मैं इसे एक शॉट दूंगा।जावा में नेस्टेड टाइप पैरामीटर्स
//Not legal java code
public class Foo<C extends Collection<T>> { //where T is another type parameter
private C coll;
public Foo(C coll) {
this.coll = coll;
}
public void add(T elem){
this.coll.add(elem);
}
//UPDATED TO ADD GETTER
/**
* I may need to retrieve the collection again, or pass it
* on to another function that needs the specific C type
*/
public C getColl(){
return coll;
}
}
...
List<String> strings = new ArrayList<String>();
Foo<List<String>> foo = new Foo<List<String>>(strings);
foo.add("hello");
मुझे पता है कि मैं इसे एक और प्रकार पैरामीटर जोड़कर कर सकता है:
public class Foo<C extends Collection<T>,T>
लेकिन फिर मैं अनावश्यक जोड़ने के लिए:
Foo<List<String>,String> foo = new Foo<List<String>,String>(strings);
और मेरी असली दुनिया मामले में, मेरे जेनरिक को कभी-कभी
public class Bar implements Baz<String>
जैसे लागू क्लॉज में निर्दिष्ट किया जा सकता है
उस दूसरे प्रकार के पैरामीटर को निर्दिष्ट करने के बाद भी और अधिक दर्दनाक है, क्योंकि ऐसा लगता है जैसे यह मेरे चेहरे में कार्यान्वयन विवरण फेंकता है। कहने के लिए
Foo<Bar,String>
जब वहाँ पहले से ही स्ट्रिंग और बार के बीच एक रिश्ता है बीत रहा है, बस असजीला लगता है। मुझे लगता है कि इसका जावा, जो कि क्षेत्र के साथ जाता है, लेकिन इसके लिए कोई समाधान होने पर बस उत्सुक है।
फैक्ट्री विधि विचार दिलचस्प है, लेकिन यह अभी भी मुझे परेशान करता है कि टाइप को दो बार निर्दिष्ट किया गया है, भले ही मेरा कोड निर्देशित करता है कि वे हमेशा समान होते हैं। –
@RusselLeggett, ठीक है, तो आपको फिर से invariance की आवश्यकता है, कोई संग्रह ' super T>'? हां। यह दर्द है। मेरी सलाह है कि आप अपनी लाइब्रेरी में जटिलता से निपटें और उन कारखानों के जरिए टेर्स एपीआई का पर्दाफाश करने का प्रयास करें जिनके रिटर्न टाइप 'इंटरफेस फू जटिल फू <संग्रहसबटाइप , टी> 'बढ़ाता है ताकि ग्राहक केवल एक पैरामीटर संस्करण का उपयोग कर सकें। –