我已经花了好几个小时尝试在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
我做错了什么?
答案 0 :(得分:2)
这可能是Kotlin如何处理泛型通配符的问题。
使用Dagger 2 Multibindinds时,Dagger(使用Java Reflection分析代码并生成组件实现)将Map的类型解释为Map<eRetrofitModules, ? extends Provider<Retrofit>>
。发生这种情况是因为maps in Kotlin将V
类型参数标记为out
。
@JvmSuppressWildcards注释从已编译的代码中删除该信息。只需在Provider<Retrofit>
上使用该注释:
Map<eRetrofitModules, @JvmSuppressWildcards Provider<Retrofit>>
。
您可能还会发现this answer有趣。