2015-04-16 5 views
6

मान लीजिए मैं निम्नलिखित पैटर्न मेरी कोड में अक्सर दोहरा है:गिइस: मैं सभी प्रकार के लिए जेनेरिक कैसे बांधूं?

class A<T> { 
    @Inject 
    public A(List<T> list) { 
     // code 
    } 
} 

मैं सभीList<T>ArrayList<T> करने के लिए बाध्य करना चाहते हैं। मुझे पता है कि मैं एक स्पष्ट कच्चे प्रकार को बांधने के लिए TypeLiteral एस का उपयोग कर सकता हूं, उदाहरण के लिए, List<String>, लेकिन क्या यह सभी प्रकार के लिए ऐसा करने के लिए वैसे भी है?

मूल रूप से, इस कोड को असफल नहीं होना चाहिए क्योंकि मैं सूची स्पष्ट रूप से बाध्य नहीं किया:

injector.getInstance(new Key<A<Integer>>(){}); 
+1

मुझे क्या मिला और अब तक की कोशिश की के आधार पर। यह संभव नहीं है। –

+1

इस तरह के "वाइल्डकार्ड" बाध्यकारी की कुछ चर्चा यहां पाई जा सकती है: https://github.com/google/guice/issues/852 –

उत्तर

3

यह Guice में संभव नहीं है। आंतरिक रूप से Guice HashMap<Key, Provider<?>> से थोड़ा अधिक है, जहां Key एक वैकल्पिक बाध्यकारी एनोटेशन और एक पूर्णतः योग्यता प्रकार का प्रतिनिधित्व करता है। प्रकारों के "पैटर्न" से मेल खाने के लिए एक कुंजी की तरह अधिक व्यवहार करने की आवश्यकता होगी, जिसके लिए एक बहुत ही अलग वास्तुकला की आवश्यकता होगी और जो बाध्यकारी लुकअप को धीमा कर देगा।

इसके अलावा, हालांकि आप एक साधारण उदाहरण के लिए सूची का उपयोग कर रहे हैं, याद रखें कि गुइस बाइंडिंग समकक्ष कार्यान्वयन के लिए बेहतर आरक्षित हैं जो उत्पादन या परीक्षण में भिन्न होने की संभावना है। बहुत अलग एल्गोरिदम-विशिष्ट प्रदर्शन विशेषताओं के अलावा, सूची कार्यान्वयन null आइटमों को संभालने की उनकी क्षमता में भिन्न होता है, और एक बार जब आप किसी दिए गए एल्गोरिदम के लिए आदर्श सूची कार्यान्वयन चुनते हैं तो आपको इसे बदलने की आवश्यकता नहीं होती है - खासकर आवेदन-व्यापी विन्यास।

आप Guice शैली विन्यास के साथ अपने सामान्य कार्यान्वयन भिन्न करने, ListFactory की तरह एक बहुत छोटे से कारखाने बनाने में सक्षम होना चाहते हैं, तो:

public class ListFactory { 
    public <T> List<T> createFooBarList() { return new ArrayList<T>(); } 
    public <T> List<T> createSomeOtherList() { return new LinkedList<T>(); } 
} 
संबंधित मुद्दे