Generics 获取要创建的改装接口类的函数导致错误的返回类型

Generics 获取要创建的改装接口类的函数导致错误的返回类型,generics,kotlin,retrofit2,Generics,Kotlin,Retrofit2,我正在开发一个有3个天气API的应用程序,我希望我的用户能够选择使用哪一个。每个API都有各自的数据格式,所以我想创建一个函数来创建适当的接口,然后对其进行封装,所以结果是很常见的,这样我就可以用相同的方式处理每个接口。 因此,我的代码如下所示: fun create(api: Apis): ApiDataSource = retrofitBuilder .baseUrl(getBaseUrlFor(api)) .build() .create(g

我正在开发一个有3个天气API的应用程序,我希望我的用户能够选择使用哪一个。每个API都有各自的数据格式,所以我想创建一个函数来创建适当的接口,然后对其进行封装,所以结果是很常见的,这样我就可以用相同的方式处理每个接口。 因此,我的代码如下所示:

fun create(api: Apis): ApiDataSource = retrofitBuilder
        .baseUrl(getBaseUrlFor(api))
        .build()
        .create(getInterfaceClassFor(api))
        .convertWith(interfaceConverter)
}

fun Api1.convertWith(interfaceConverter: InterfaceConverter): CommonWeatherDataEntity = ...

private fun getInterfaceClass(api: Apis): Class<*> = when (api) {
    Apis.Api1 -> Api1Interface::class.java
    Apis.Api2 -> Api2Interface::class.java
}

因为(…)时为
推断的类型不是
Class
,而是
Class
,其中
X
Api1Interface
Api2Interface
的常见超类型。因此
create
返回
X

通过删除
getInterfaceClass
的返回类型并检查IDE显示的内容,您应该能够看到这一点

fun Apis.createInterface(retrofitBuilder: Retrofit.Builder) =
    retrofitBuilder.baseUrl(getBaseUrlFor(this))
        .build()
        .create(
            when (this) {
                Apis.Api1 -> Api1Interface::class.java
                Apis.Api2 -> Api2Interface::class.java
            }
        ).convertWith(interfaceConverter)