为什么我会收到@ Provide-annotated错误?

时间:2017-12-27 11:33:21

标签: java android kotlin dagger-2

我已经花了好几个小时尝试在google中找到我的两个匕首实现的区别。 它是像这样实现的

@Module
class MatchesModule
{
@Provides
@NetworkScope
@IntoMap
@RetrofitModulesName(eRetrofitModules.MATCHES)
fun retrofitMatches(okHttpClient: OkHttpClient, rxAdaptor: RxJava2CallAdapterFactory, iBuilder: Retrofit.Builder): Retrofit = iBuilder.addConverterFactory(GsonConverterFactory.create(mDeserializerMatches));
}

此方法提供Retrofit对象,我也使用注释@IntoMap@RetrofitModulesName(...),以便将所有这些Retrofit对象放置到地图中。

@Module
class PreviewModule
{
@Provides
@PreviewScope
fun provideMatchesPresenter(retrofitModules: Map<eRetrofitModules, Retrofit>): IMatchPresenter = MatchPresenter(retrofitModules)
}

我收到所有Retrofit个对象并将它们传递给MathcPresenter一切都没问题。 但是我希望在我的演示者中获得Map<Foo, Provider<Retrovit>>。 所以,我在论证

中添加了这个词Provider
@Provides
@PreviewScope
fun provideMatchesPresenter(retrofitModules: Map<eRetrofitModules, 
Provider<Retrofit>>): IMatchPresenter = MatchPresenter(retrofitModules)

以及MathcPresenter

的构造函数
class MatchPresenter(retrofitModules: Map<eRetrofitModules, Provider<Retrofit>>): IMatchPresenter

现在我不能解释为什么,但是我得到了这样的错误

  

错误:(6,1)错误:[com.example.alexeyt.sunshinekotlin.moduls.previewmodule.PreviewComponent.inject(com.example.alexeyt.sunshinekotlin.ui.fragments.previewFragments.PreviewFragment)] java.util。地图&GT;如果没有@Annex-annotated方法,则无法提供。

PreviewScope

@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class PreviewScope

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这可能是Kotlin如何处理泛型通配符的问题。

使用Dagger 2 Multibindinds时,Dagger(使用Java Reflection分析代码并生成组件实现)将Map的类型解释为Map<eRetrofitModules, ? extends Provider<Retrofit>>。发生这种情况是因为maps in KotlinV类型参数标记为out

@JvmSuppressWildcards注释从已编译的代码中删除该信息。只需在Provider<Retrofit>上使用该注释:

Map<eRetrofitModules, @JvmSuppressWildcards Provider<Retrofit>>

您可能还会发现this answer有趣。