Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 匕首2不';无法识别Kotlin中提供的方法。Java很好用_Android_Kotlin_Dagger 2 - Fatal编程技术网

Android 匕首2不';无法识别Kotlin中提供的方法。Java很好用

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

Dagger无法识别Kotlin中提供的方法。这是本模块的重要部分:

    @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>? { ... }