当前位置: 首页 > 知识库问答 >
问题:

从Google Guice获取通配符实例

公羊向荣
2023-03-14

你好,我正在尝试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);
}

现在,当我运行代码时,GoogleGuice能够找到Foo的实例

有没有办法配置GoogleGuice来解析Foo


共有1个答案

赵锐
2023-03-14

绑定类型:

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

如果你还想绑定Foo

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

或者,使用提供者方法:

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

 类似资料:
  • 这个问题与Weblogic 12c有关。 我有一个EAR文件,我想在各种环境中部署(dev、QA、pre-prod和prod)。然而,我的应用程序需要用户名和密码(用于连接到另一台服务器),而这四种环境中的用户名和密码并不相同。我不想在4个不同的EAR文件中打包4个不同的属性文件。我想要一个通用的EAR文件。此外,我不想在打包期间处理prod密码。 理想情况下,我希望每个环境的管理员为环境提供适当

  • 问题内容: 前几天,我正在查看别人的代码,遇到了引起关注的一行。为简化起见,假设我有一个通用的A类和一个抽象的B类。是否允许以下​​实例化?如果可以,为什么? 我个人从未见过像上面这样的实例化,尽管有这样的声明: 肯定会成立。我一直在泛型中使用通配符声明方法参数,所以我可能没有经验。 问题答案: 其实不编译。自Java 5以来,它一直是非法的。 但是我想你原来的例子是这样的。后者在Java的最新版

  • 方法在类型不适用于参数

  • 问题内容: 可以说我有一个包含x个未知字符的字符串。我怎么能得到char nr。13或char nr。x-14? 问题答案: 首先,确保所需的数字是从开头或结尾开始的字符串 的有效索引 ,然后可以简单地使用数组下标表示法。用于获取字符串长度

  • 问题内容: 在以下代码段中: 尽管类型似乎完全匹配,但分配是错误的。 我通过将Collection的类型指定为另一个通用参数,设计出了一种肮脏的解决方法,如下所示: 但是该参数实际上是“无关”类型,只会使API复杂化,在保持类型安全的同时,有没有什么方法可以摆脱它呢? 谢谢。 问题答案: 这样做就可以了: 您仍然可以像这样使用迭代器: 作为参考,请阅读get and put原理 (最初来自Java

  • “帮助系统”一节 脱字符 Shell 中的一些功能是通过特殊符号作为控制字符来实现的,上面已经介绍了很多了。这产生一个问题,如果一个文件名中,刚好包含了这些字符,比如 ; ,就很难对它进行操作。使用 less 浏览这个文件 less ;xxx less 会很快返回一个错误信息,因为并没有一个文件名作为操作对象。接着,Shell 会报告,系统中没有 xxx 这个命令。 这是因为 Shell