2011-02-11 17 views
7

साथ इंटरफेस के लिए मैं एक अंतरफलक TestInterface < है यू, वी > कई कार्यान्वयन है कि, जब मैं बंधन के लिए Guice का उपयोग मुझे यह संदेश TestInterface < Impl1, Impl2 > नहीं एक कार्यान्वयन के लिए बाध्य कर मिलता है। निम्नलिखित वाक्यविन्यास है जिसका उपयोग मैं अपने कार्यान्वयन के साथ इंटरफेस को बांधने के लिए कर रहा हूं।Guice annotatedWith जेनेरिक्स

बाइंड (TestInterface.class) .annotatedWith (नाम। नाम ("Impl1Test"))। (Impl1.class);

पेज। मैंने एक डमी इंटरफ़ेस के साथ परीक्षण किया लेकिन जेनरिक के बिना और यह ठीक काम किया, मैं जेनरिक के लिए कुछ विशेष जरूरतों को मानता हूं।

उत्तर

11

सामान्य प्रकार बाध्यकारी करते समय, आपको कच्चे class के बजाय TypeLiteral का उपयोग करने की आवश्यकता है। अन्यथा, गुइस सामान्य प्रकारों के बीच अंतर करने में सक्षम नहीं होगा। आपके मामले में, यह कुछ इस तरह दिखेगा:

bind(new TypeLiteral<TestInterface<Impl1, Impl2>>(){}) 
    .annotatedWith(Names.named("Impl1Test")) 
    .to(Impl1.class); 

तुम भी annotatedWith की जरूरत नहीं हो सकती है यदि आप अन्य चीजें हैं जो आप TestInterface<Impl1, Impl2> के रूप में बाध्य करने के लिए चाहते हैं नहीं है। TypeLiteral के निर्माण में {} पर ध्यान दें ... जेनेरिक प्रकार की जानकारी संरक्षित रखने के लिए TypeLiteral का अज्ञात उप-वर्ग आवश्यक है।

+0

मीठा, धन्यवाद कॉलिन! – Abidi

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