我正在开发一个具有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)
答案 0 :(得分:1)
因为为when(...)
推断的类型不是Class<*>
,而是Class<out X>
,其中X
是Api1Interface
和Api2Interface
的常见超类型。因此create
返回X
。
通过删除getInterfaceClass
的返回类型并检查IDE显示的内容,您应该能够看到这一点。