【问题标题】:Get a wildcard instance from Google Guice从 Google Guice 获取通配符实例
【发布时间】:2021-12-09 13:32:27
【问题描述】:

嗨,我正在尝试Google Guice 5.x。我的班级定义为:

public class Foo<T> {
    // some logic here
}

它正在其他类中使用,例如:

public class Bar {

    private final Foo<Chocolate> provider;

    public Bar(Foo<Chocolate> _choco) {
        this.provider = _choco;
    }
}


public abstract class BaseZoo { // in some other package in a different jar

    private final Injector injector = Guice.createInjector(new MyAppModule());

    private Foo<?> provider;

    public String doSomething() {

        if (provider == null)
            this.provider = this.injector.getInstance(Foo.class);

        // some other code logic.
    } 
}

现在,在我的模块文件中 (MyAppModule) 我将 Foo 定义为:

@Inject
@Provides
@Singleton
public Foo<Chocolate> getFoo(FooDependency fooDep) {
    return new Foo<>(fooDep);
}

现在,当我运行我的代码时,Google Guice 能够找到 Foo&lt;Chocolate&gt; 的实例,但无法找到 Foo&lt;?&gt; 的实例。

有没有办法配置 Google Guice 以使用 Foo&lt;Chocolate&gt; 的实例解析 Foo&lt;?&gt;

【问题讨论】:

    标签: java guice


    【解决方案1】:

    绑定类型:

    @Inject
    @Provides
    @Singleton
    public Foo<?> getFoo(FooDependency fooDep) { ... }
    

    如果你还想绑定Foo&lt;Chocolate&gt;,使用问题中的@Provides方法,同时绑定Foo&lt;?&gt;,你可以在你的configure方法中这样做:

    bind(new Key<Foo<?>>() {}).to(new Key<Foo<Chocolate>>() {});
    

    或者,使用提供者方法:

    @Provides
    Foo<?> provideWildcardFoo(Foo<Chocolate> chocolateFoo) {
      return chocolateFoo;
    }
    

    【讨论】:

    • 你的意思是有两个定义,一个用于Foo&lt;?&gt;,另一个用于Foo&lt;Chocolate&gt;
    • 如果你想绑定到Foo&lt;?&gt;,你必须专门绑定到Foo&lt;?&gt;。我不知道你还有什么要求。
    • 这两种方法都对我有用。我只是好奇为什么它不起作用,直到我注意到 Guice Foo&lt;Chocolate&gt;Foo&lt;?&gt;Foo 被问到三种不同的类型,所以做一个 injector.getIntance(Foo.class) 实际上是在寻找一个Foo 而不是 Foo&lt;?&gt;。这对我来说是不正确的,因为我实际上需要获取Foo&lt;?&gt; 而不是Foo 的实例。感谢您的两种方法。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多