java - 使用 Dagger 注入(inject)通配符类型

标签 java generics dependency-injection dagger

我刚刚不知不觉地走进了一个泛型漏洞并遇到了 Dagger 对象图验证错误(我假设这是 dagger-compile 验证但没有生成特定的错误消息 - 只是 maven 的漂亮的 BUILD FAILURE 消息)。我正在尝试注入(inject)通配符类型的实现。我有点不知所措,我应该阅读哪些内容才能更好地理解我创建的问题,所以这里是代码;

@Inject Provider<MarkerOption<?>> markerOptionProvider;

与模块定义;

  @Provides MarkerOptions<?> provideMarkerOptions() {
    MarkerOptions<?> options;
    if (ConnectionResult.SUCCESS == GooglePlayServicesUtil.isGooglePlayServicesAvailable(context)) {
      // This is the Google maps MarkerOption impl
      options = new GoogleMapMarkerOptions(new com.google.android.gms.maps.model.MarkerOptions());
    } else {
      // This is the osmdroid impl of MarkerOptions
      options = new OsmDroidMarkerOptions();
    }

    return options;
  }

我猜这里的代码味道是 Provider 注入(inject),但我有兴趣更好地理解 dagger-compiler 在尝试解决实现时遇到的问题。值得注意的是,删除通配符泛型 <?>允许 Dagger 计算应用程序运行所需的对象图。我原以为无论接口(interface)类型如何,MarkerOptions 提供程序的注入(inject)都会利用模块 MarkerOptions 绑定(bind)。

如果有人能向我解释哪里出了问题/为什么我不应该走到这一步,那么将不胜感激。

最佳答案

Dagger 目前不支持注入(inject)中的通配符类型。您需要注入(inject)具体类型或原始类型(如您所见)。

理论上可以支持简单的通配符,只要提供的是Foo<?>即可。注入(inject)的是Foo<?> - 部分匹配会让人望而却步。

关于java - 使用 Dagger 注入(inject)通配符类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23163709/

相关文章:

java - 在运行 JUnit/TestNG 测试套件时,是否有任何*真正的*解决方案来利用多核?

java - 具有相同标识符值的不同对象已与 session :. 关联,合并和 saveOrUpdate 均不起作用

C# 通用约束无法正常工作

java - 如何使用嵌套的通用参数创建 MinMaxPriorityQueue?

c# - 让类将自身作为参数传递给泛型基类是邪恶的吗?

java - 创建名称为 'application' 的 bean 时出错,未找到默认构造函数;嵌套异常是 java.lang.NoSuchMethodException

java - 从 jTable 中的多个选定行获取数据

java - 如何删除 SWT 按钮的边框,使其看起来像一个标签

c# - 如何使用标准 MVC Core 依赖注入(inject)解决未注册的类型

c# - 为什么 CaSTLe Windsor 试图将我的 'Content' 和 'Scripts' 文件夹解析为 Controller ?