Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guice CreationException-未绑定类型Foo的实现_Java_Dependency Injection_Guice - Fatal编程技术网

Java Guice CreationException-未绑定类型Foo的实现

Java Guice CreationException-未绑定类型Foo的实现,java,dependency-injection,guice,Java,Dependency Injection,Guice,需要一些帮助来理解这个错误和可能的解决方法 所以我有这样一种类型: class Foo { static final class Bar {} @Inject Foo(TypeA a, @Nullable Set<Bar> b) {} } class-Foo{ 静态最终类条{} @注入 Foo(typeaa,@Nullable Set b){} } 为了使Foo可注入,我需要实现对 参数a和b,现在我可以提供类型a了 实现,它不是空的,所以我在 包模块类。但是

需要一些帮助来理解这个错误和可能的解决方法

所以我有这样一种类型:

class Foo {
   static final class Bar {}

   @Inject
   Foo(TypeA a, @Nullable Set<Bar> b) {}
}
class-Foo{
静态最终类条{}
@注入
Foo(typeaa,@Nullable Set b){}
}
为了使Foo可注入,我需要实现对 参数a和b,现在我可以提供类型a了 实现,它不是空的,所以我在 包模块类。但是b呢?它是一个可空的,怎么写 @提供了一个可以为null的参数?我猜是这样 不应该是必需的,Guice应该理解注释。。。 但有些地方不对劲,我有个错误:

1) 未绑定
java.util.Set
的实现

这里是@Provides方法(在atm中不起作用)

@提供@Nullable
公共Foo provideFoo(a类,可空集b){
返回新的Foo(a,b);
}
我知道嵌套类不是公共类,也不是构造函数,所以可能 guice无法访问它,但即使我将它们全部公开(我 真的不想)错误仍然存在。。。我有什么事吗
失踪

Set
没有任何绑定与对
Set
有绑定(即
null
)是有区别的

您需要一个
@Provides
方法来返回
集(可能是
null
)或类似
bind(Bar.class).toProvider(Providers.ofInstance(null))
,以便能够向
Foo
的构造函数提供第二个参数


还要注意的是,您的
@为
Foo
提供了
方法,它只是直接调用
@Inject
带注释的构造函数,因此根本没有必要这样做。我还想说,最好绑定到一个空的
集合
而不是
null

集合
没有任何绑定与
集合
绑定(即
null
)是有区别的

您需要一个
@Provides
方法来返回
集(可能是
null
)或类似
bind(Bar.class).toProvider(Providers.ofInstance(null))
,以便能够向
Foo
的构造函数提供第二个参数


还要注意的是,您的
@为
Foo
提供了
方法,它只是直接调用
@Inject
带注释的构造函数,因此根本没有必要这样做。我还想说,最好绑定到空的
集合
而不是
null

您真的需要null集合吗?您可以使用空集吗?不完全可以,但最初的想法也是不要求客户机提供一个set对象(即使客户机并不真正关心,也要构造一个空集),Foo构造函数会检查null,并在需要时创建一个空集。我知道我可以通过添加Foo(TypeA)和删除@Nullable来重载构造函数。也许我应该考虑一下。你真的需要空集合吗?您可以使用空集吗?不完全可以,但最初的想法也是不要求客户机提供一个set对象(即使客户机并不真正关心,也要构造一个空集),Foo构造函数会检查null,并在需要时创建一个空集。我知道我可以通过添加Foo(TypeA)和删除@Nullable来重载构造函数。也许我应该考虑一下。因此,根据你的建议,我是否应该将这段代码重构为类似这样的东西(斯塔斯·库林(Stas Kurilin)的早期回复似乎暗示了这一点)。两个构造器,Foo(TypeA a)和Foo(TypeA a,Set b),然后@Inject第一个构造器?因此,根据你的建议,我是否应该将这段代码重构成这样的东西(Stas Kurilin的早期回复似乎暗示了这一点)。两个构造函数Foo(typeaa)和Foo(typeaa,Set b),然后@Inject第一个?
@Provides @Nullable
public Foo provideFoo(TypeA a, @Nullable Set<Foo.Bar> b) {
    return new Foo(a, b);
}