匕首:上课不能与钥匙绑在一起

我正在尝试第一次匕首,在配置模块后,我得到一个我不明白的错误。

我的代码是:

public class Parrot { private Language language; @Inject public Parrot(Language language) { this.language = language; } public void sayHello() { System.out.println(language.getSalute()); } } public interface Language { public String getSalute(); } public class EnglishLanguage implements Language { @Override public String getSalute() { return "Hello!"; } } 

我的模块是

 @Module( injects = Language.class ) public class PetShopModule { @Provides Parrot provideParrot(Parrot parrot){ return parrot; } } 

在代码中我以这种方式使用它

 EnglishLanguage lang=SystemApp.getSystemLanguage(); ObjectGraph objectGraph = ObjectGraph.create(new PetShopModule()); objectGraph.inject(myLanguage); Parrot parrot = objectGraph.get(Parrot.class); 

编译器抱怨:

 error: com.example.petshop.Language could not be bound with key com.example.petshop.Language required by com.example.petshop.PetShopModule for com.example.petshop.PetShopModule 

我做错了什么?

注意:这只是一个简化的例子,在真正的代码中,EnglishLanguage是一个系统类,我不能修改也不能创建它,只是得到一个参考

我们不是评论你做错了什么,而是给出正确的例子,并解释那里发生的事情。

这个片段是完美的,并保持原样:

 public class Parrot { private Language language; @Inject public Parrot(Language language) { this.language = language; } public void sayHello() { System.out.println(language.getSalute()); } } public interface Language { public String getSalute(); } public class EnglishLanguage implements Language { @Override public String getSalute() { return "Hello!"; } } 

使用Parrot构造函数上的@Inject注释,你告诉Dagger,“每当我请求一个Parrot实例时,使用这个构造函数来实例化它”。

Dagger发现Parrot需要一个Language接口的实例,并试图find一种方法来检索它。 但是,由于Language是一个界面,Dagger需要知道要使用哪种具体types。

由于您无法编辑EnglishLanguage类,因此您需要为其编写@Provider方法:

 @Module public class PetshopModule { @Provides Language provideLanguage() { return SystemApp.getSystemLanguage(); } } 

现在,您应该可以从ObjectGraph获取Parrot的实例,如下所示:

 ObjectGraph graph = ObjectGraph.create(new PetshopModule()); Parrot parrot = graph.get(Parrot.class); 

我没有测试过,这应该有用。


如果您能够修改EnglishLanguage类,则可以执行以下操作。 使用@Inject注释EnglishLanguage构造函数,并在Language提供程序方法中请求一个EnglishLanguage实例:

 public class EnglishLanguage implements Language { @Inject public EnglishLanguage() { } @Override public String getSalute() { return "Hello!"; } } @Module public class PetshopModule { @Provides Language provideLanguage(EnglishLanguage language) { return language; } } 

在这种情况下,Dagger会查找Language提供程序方法,并实例化一个返回的EnglishLanguage