2015-12-09 3 views
8

मैं एक सामान्य प्रकार बाध्यकारी ओवरराइड करना चाहता हूं, लेकिन मुझे हमेशा "No implementation was bound" त्रुटि मिल गई। यहाँजब मैं गुइस के साथ सामान्य बाध्यकारी को ओवरराइड करने का प्रयास करता हूं तो मुझे कोई त्रुटि क्यों होती है? (TypeLiteral)

public interface IParser<I, O> {} 

public class Parser1 implements IParser<String, String> { 
    IParser<String, String> mParser; 

    @Inject 
    public Parser1(IParser<String, String> parser) { 
     mParser = parser; 
    } 
} 

public class Parser2 extends Parser1 { 
    @Inject 
    public Parser2(IParser<String, String> parser) { 
     super(parser); 
    } 
} 

public class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1>() {}); 
    } 
} 

और मेरे इंजेक्टर रचना है:

मैं roboguice 3.

यहाँ उपयोग कर रहा हूँ कोड का एक उदाहरण है कि मैं का उपयोग करें

RoboGuice.getOrCreateBaseApplicationInjector(this, 
       RoboGuice.DEFAULT_STAGE, 
       RoboGuice.newDefaultRoboModule(this), 
       Modules.override(new MyModule()).with(new AbstractModule() { 
        @Override 
        protected void configure() { 
         bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser2>() {}); 
        } 
       }) 
); 

अगर मैं डॉन ' टी इसे ओवरराइड करने का प्रयास करें (केवल उपयोगकर्ता पार्सर 1), सब ठीक है, जब मैं प्रदाताओं के साथ मानक ऑब्जेक्ट को ओवरराइड करता हूं, तो यह भी अच्छी तरह से काम करता है, लेकिन TypeLiteral के साथ नहीं।

मेरे त्रुटि है:

com.google.inject.CreationException: Unable to create injector, see the following errors: 
1) No implementation for IParser<String, String> was bound. 

क्या मैं गलत कर रहा हूँ?

धन्यवाद।

+0

किसी को भी एक सुराग है? क्या ऑरेलियन को अधिक जानकारी प्रदान करने की आवश्यकता है? –

+0

मैं गुइस 4 के तहत इस व्यवहार को पुन: उत्पन्न करने में असमर्थ हूं। मुझे लगता है कि एक परिपत्र निर्भरता है, जो कि गुइस एक प्रॉक्सी वर्ग शिम को संतुष्ट करने के लिए उपयोग कर रहा है। Roboguice कहीं प्रॉक्सी अक्षम कर सकता है? – Cardano

+0

साइड नोट: आपको कभी भी 'नया टाइप लिटरल () {} 'की आवश्यकता नहीं है, आप केवल' ASimpleType.class' – Cardano

उत्तर

1

मैं shure कर रहा हूँ नहीं है, लेकिन यह मेरे लिए उल्लेखनीय लग रहा है कि एक एक conrete उदाहरण के लिए बाध्य एक Class के बजाय प्रयोग किया जाता है:।

बाँध (नई TypeLiteral>() {}) (नई TypeLiteral को() {});

आप

bind(new TypeLiteral<IParser<String, String>>() {}).to(Parser2.class}); 

कोशिश किया था?

+0

का उपयोग कर सकते हैं, शाब्दिक उदाहरण के लिए बाइंडिंग कक्षा के लिए बाध्यकारी के बराबर है। – Cardano

6

आपको कक्षाओं की परिभाषा को बदलना चाहिए जो आपके इंटरफेस को लागू कर रहे हैं।

इस प्रयास करें:

public class Parser1<I, O> implements IParser<I, O> { 
} 
public class Parser2<I, O> extends Parser1<I, O> { 
} 

और फिर आप इस तरह से कक्षा में अपने इंटरफेस के लिए बाध्य कर सकते हैं:

bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1<String, String>() {}); 
+0

इसे कार्यान्वयन कक्षाओं पर टाइप पैरामीटर की आवश्यकता नहीं होनी चाहिए, जिससे उनका कोई प्रभाव नहीं पड़ेगा कि गुइस बाइंडिंग का इलाज कैसे करता है। – Cardano

+0

इस मामले में आपको "I" को आपके उत्तर में से किसी एक पंक्ति में हल नहीं किया जा सकता है। यह संकलन भी नहीं करता है। – vasigorc

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

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