Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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通用提供程序(提供程序本身是通用的,而不是它绑定到的类)_Java_Inheritance_Dependency Injection_Guice_Constructor Injection - Fatal编程技术网

Java Guice通用提供程序(提供程序本身是通用的,而不是它绑定到的类)

Java Guice通用提供程序(提供程序本身是通用的,而不是它绑定到的类),java,inheritance,dependency-injection,guice,constructor-injection,Java,Inheritance,Dependency Injection,Guice,Constructor Injection,关于如何使用Guice提供程序绑定到泛型类,如和,有很多在线资源。但是,我很难找到一个关于如何使用通用提供者的资源 例如,假设我有以下内容: public interface Foo { ... } public class Bar implements Foo { ... } 如您所见,Bar有一个注入参数,该参数必须在构造函数中。在我的情况下,我们不能将此参数移动到字段或方法注入 所以,现在我想为Foo编写一个提供者,但它返回一个Bar实例。大概是这样的: @Single

关于如何使用Guice提供程序绑定到泛型类,如和,有很多在线资源。但是,我很难找到一个关于如何使用通用提供者的资源

例如,假设我有以下内容:

public interface Foo {
    ...
}

public class Bar implements Foo {
    ...
}
如您所见,Bar有一个注入参数,该参数必须在构造函数中。在我的情况下,我们不能将此参数移动到字段或方法注入

所以,现在我想为Foo编写一个提供者,但它返回一个Bar实例。大概是这样的:

@Singleton
public class FooProvider<T extends Foo> extends Provider<Foo> {
    @Inject
    public FooProvider(Object someParameterWeMustInjectIntoConstructor) {
        ...
    }
    ...
    @Override
    public Foo get() {
        return new Bar(...);
    }
    ...
}
@Singleton
公共类FooProvider扩展了提供程序{
@注入
public FoopProvider(对象someParameterWeMustInjectIntoConstructor){
...
}
...
@凌驾
公共Foo-get(){
返回新条(…);
}
...
}
请注意,这个类是如何依赖Guice注入本身的单例,因此必须使用
.toProvider(FooProvider.class)
配置提供程序。我们也只能使用构造函数注入,而不能使用方法或字段注入,这可能是因为此提供程序具有类型层次结构

我试图找到某种使用
.toProvider(FooProvider.class)
的was,但我们都知道这不是有效的Java语法。有人知道我如何使用
.toProvider(Class
toProvider(newtypeliteral(){});

你必须使用reflection它不清楚为什么你必须使用
fooproviderextensedprovider
而不是,比如说,
FooBarProvider extensedprovider{…return new Bar(…);}
。如果你真的需要这样的东西,你能详细说明为什么需要它吗?我接受的答案就是我想要的:)
toProvider
需要一个
提供者,而不是
TypeLiteral
。无法及时理解链接语法,让我们试试。太棒了!不知道我怎么会错过JavaDoc中的这个。
toProvider(new TypeLiteral<FooProvider<Bar>>() { });