使用Dagger注入通配符类型

时间:2014-04-18 23:04:35

标签: java generics dependency-injection dagger

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

@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注入,但我有兴趣更好地理解dagger-compiler在尝试解决实现时遇到的问题。值得注意的是,删除通配符通用<?>允许Dagger计算应用程序运行所需的对象图。我期望注入MarkerOptions提供者会利用模块MarkerOptions绑定,而不管接口类型如何。

如果有人能够向我解释出现了什么问题/为什么我不应该这么做,那么这将是非常值得赞赏的。

1 个答案:

答案 0 :(得分:2)

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

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