【发布时间】:2018-06-11 18:39:46
【问题描述】:
有一个基类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.java 传递为Class<T>
希望在基 A 中有一个抽象函数来返回类类型
abstract fun<T> getRemoteServiceClassType() : Class<T>
因此可以在基础 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>
}
为什么不能为Class<T> 返回IBService::java.class,而是将IBService::class.java 传递给需要Class<T> 的函数?
【问题讨论】:
-
override fun<T> getRemoteServiceClassType() : Class<T> {这个函数定义说这个函数的作用是你可以为 anyT请求Class<T>,而不是IBService的一些T选择。