Android 匕首2不';无法识别Kotlin中提供的方法。Java很好用
Dagger无法识别Kotlin中提供的方法。这是本模块的重要部分:Android 匕首2不';无法识别Kotlin中提供的方法。Java很好用,android,kotlin,dagger-2,Android,Kotlin,Dagger 2,Dagger无法识别Kotlin中提供的方法。这是本模块的重要部分: @Provides @AppScope fun provideClient(cache: Cache, interceptors: List<Interceptor>?): OkHttpClient { val httpBuilder = OkHttpClient.Builder() interceptors?.let { for
@Provides
@AppScope
fun provideClient(cache: Cache, interceptors: List<Interceptor>?): OkHttpClient {
val httpBuilder = OkHttpClient.Builder()
interceptors?.let {
for (interceptor in interceptors) {
httpBuilder.addInterceptor(interceptor)
}
}
return httpBuilder
.cache(cache)
.build()
}
@Provides
@AppScope
fun provideInterceptors(): List<Interceptor>? {
return listOf(HttpLoggingInterceptor().setLevel(WebServiceConfig.LOGGING_LEVEL))
}
@提供
@应用范围
fun ProviderClient(缓存:缓存,拦截器:列表?):OkHttpClient{
val httpBuilder=OkHttpClient.Builder()
拦截器?,让我来{
for(拦截器中的拦截器){
httpBuilder.addInterceptor(拦截器)
}
}
返回httpBuilder
.cache(缓存)
.build()
}
@提供
@应用范围
fun ProviderInterceptors():列表?{
返回listOf(HttpLoggingInterceptor().setLevel(WebServiceConfig.LOGGING_LEVEL))
}
错误消息如下所示:
AppComponent.java:15: error: java.util.List<? extends okhttp3.Interceptor> cannot be provided without an @Provides-annotated method.
AppComponent.java:15:error:java.util.List证明这是泛型互操作问题
当您使用接口的列表
(如拦截器
)作为Kotlin中的参数时,您可以从Java的角度将其视为列表类型参数的通配符,因为列表
是协变的:
OkHttpClient provideClient(List<? extends Interceptor> interceptors) { ... }
将显式out
差异添加到列表中,您将在ProviderInterceptors
方法中返回该列表。有趣的是,当您查看来自Java的自动完成时,这并没有显示出来,但它修复了构建
fun provideInterceptors(): List<out Interceptor>? { ... }
fun ProviderInterceptors():列表?{ ... }
使用MutableList
接口,正如您所发现的,该接口没有这个问题
至于为什么只有在使用列表而不是可变列表时才会发生这种情况:列表
的类型参数只在out
位置,因此它是协变的。这会导致为列表
生成通配符,但不会为不变的可变列表
生成通配符(这就是为什么它可以正常工作的原因)
还要注意,只有当类型参数是非最终类型(开放类或接口)时,才会生成通配符。所以你不会因为,比如说,一个<代码>列表
(这是最终版本),而会因为一个
列表
(不是)。你能把你的拦截器提供程序放在你的客户端提供程序之上,然后重新构建吗?这没有什么不同。但我试过了。同样的问题。我知道这不会有什么不同,但我以某种方式解决了这样一个问题。当您尝试将dagger与kotlin一起使用时,您会遇到一些有趣的问题和解决方案。您可以尝试查看kotlin字节码(操作“Show kotlin Bytecode”)并将其反编译为java,看看它们是否混淆了某些类型。嘿,非常感谢。我使用了第3个:可变列表。
interceptors: List<@JvmSuppressWildcards Interceptor>?
fun provideInterceptors(): List<out Interceptor>? { ... }