2015-12-09 13 views
8

Genel bir tür bağlamayı geçersiz kılmak istiyorum, ancak her zaman "No implementation was bound" hatasını aldım. Ben roboguice İşte 3.Guice ile genel bir bağlamayı geçersiz kılmaya çalışırken neden bir hata yaşıyorum? (TypeLiteral)

kullanıyorum

kullandığım kod exemple geçerli:

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>() {}); 
    } 
} 

Ve işte benim enjektör yaratılmasıdır:

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>() {}); 
        } 
       }) 
); 

Ben etmezsen' Sağlayıcıyı (yalnızca kullanıcı Parser1) geçersiz kılmaya çalışın, her şey yolunda, standart nesneyi sağlayıcılarla geçersiz kıldığımda, çok iyi çalışır, ancak TypeLiteral ile çalışmaz.

Benim hatadır: Neyi yanlış yapıyorum

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

?

Teşekkürler.

+0

herkes bir ipucu var mı? Aurélien'in daha fazla bilgi sağlaması gerekiyor mu? –

+0

Bu davranışı Guice 4 altında yeniden oluşturamıyorum. Guice'nin, tatmin edecek bir proxy sınıfı shim kullandığı döngüsel bir bağımlılık olduğunu hatırlatırım. Roboguice proxy'leri bir yerde devre dışı bırakabilir mi? – Cardano

+0

Yan nota: Yeni TypeLiteral () {} 'ye hiç gerek yok, sadece' ASimpleType.class' – Cardano

cevap

1

ben shure değilim, ama bir bir conrete örneğine bağlama Class yerine kullanıldığını bana dikkat çekici görünüyor.

bağlama (yeni TypeLiteral>() {}) (yeni TypeLiteral için() {});

Eğer

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

denedin mi?

+0

türünü kullanabilirsiniz. Bağlam türüne örnek bağlama, sınıfa bağlanmaya eşdeğerdir. – Cardano

6

Arabiriminizi uygulayan sınıfların tanımını değiştirmelisiniz.

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

Ve sonra bu yolla sınıfa senin arayüzü bağlayabilir:

bu deneyin

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

Uygulama sınıflarında tip parametrelerini gerektirmemesi gerekir; bunları eklemek Guice'nin bağlamayı nasıl ele aldığı konusunda hiçbir etkisi olmayacaktır. – Cardano

+0

Bu durumda, "Ben" cevabınızın bir satırında bir türe çözülemezsiniz. Bu bile derleme değil. – vasigorc

İlgili konular