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

时间:2019-04-09 21:19:02

标签: generics kotlin retrofit2

我正在开发一个具有3个天气API的应用程序,我希望我的用户能够选择应使用哪个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
}

但是.create(...)之后的行以红色突出显示,并且错误提示“未解决的引用”。那是因为create返回Any!

我不理解的(显然是泛型的)是以下代码可以正常工作的原因:

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)

1 个答案:

答案 0 :(得分:1)

因为为when(...)推断的类型不是Class<*>,而是Class<out X>,其中XApi1InterfaceApi2Interface的常见超类型。因此create返回X

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