gpt4 book ai didi

class - kotlin,如何从函数返回类类型

转载 作者:行者123 更新时间:2023-12-04 22:55:10 27 4
gpt4 key购买 nike

有一个基类 A,并且类 B 和 C 都从 A 扩展

在 A 中,它具有创建改造服务的功能,该服务采用类类型作为婴儿车:

protected fun <T> createRemoteService(clazz: Class<T>, baseUrl: String): T {
return Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(createGson()))
.build()
.create(clazz)
}

在 B 类和 C 类中,可以将服务创建为(分别传入 IBService::class.java 或 ICService::class.java):

在乙:
var remoteServ: IBService
init {
remoteApi = createRemoteService(IBService::class.java, getBaseUrl())
}

在 C 中:
var remoteServ: ICService
init {
remoteApi = createRemoteService(ICService::class.java, getBaseUrl())
}

可以通过 IBService::class.javaClass<T>
想要在基 A 中有一个抽象函数来返回类类型
abstract fun<T> getRemoteServiceClassType() : Class<T>

所以可以在base A中通过获取类类型来创建服务
remoteServ: Any = createRemoteApi(getRemoteServiceClassType(), getBaseUrl())

和 B 类中的实现(出错):
override fun<T> getRemoteServiceClassType() : Class<T> {
return IBService::class.java //<=== got compiler error “Type inference
// failed. Expected type mismatch: required Class<T>
// found Class<IBService>
}

interface IBService {
@GET
fun getRemoteData(@Url url: String,
@HeaderMap headers: Map<String, String>,
@QueryMap params: Map<String, String>?):
Call<BResponseData>

}

为什么回不去了 IBService::java.classClass<T> ,但通过 IBService::class.java到需要 Class<T> 的函数好吗?

最佳答案

getRemoteServiceClassType 的“正确”签名是

abstract fun getRemoteServiceClassType() : Class<*>

如果可以返回任何类(class),或者
abstract fun getRemoteServiceClassType() : Class<out SuperType>

如果所有服务都应该有一个共同的父类(super class)型。见 https://kotlinlang.org/docs/reference/generics.html为解释。

关于class - kotlin,如何从函数返回类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50804117/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com