我刚刚无意中走进了一个泛型漏洞,遇到了一个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;
}
我猜这里的代码气味是提供者注入,但我有兴趣更好地理解dagger编译器在试图解决实现时遇到的问题。值得注意的是,删除通配符通用<?>
允许Dagger计算应用程序运行所需的对象图。我原以为MarkerOptions提供程序的注入会利用模块MarkerOptions绑定,而不管接口类型如何。
如果有人能向我解释出了什么问题/为什么我不应该走到这一步,那么我将不胜感激。
Dagger当前不支持注入中的通配符类型。您需要注入一个具体类型,或者一个原始类型(如您所发现的)。
理论上可以支持简单的通配符,只要提供的是Foo<?>
,注入的是Foo<?>
——部分匹配将是禁止的。