具有基类A,而B类和C类都从A
延伸在A中它具有创建改装服务的功能,该服务将类类型作为pram:
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):
在B:
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>
}
为什么无法为IBService::java.class
返回Class<T>
,但是将IBService::class.java
传递给需要Class<T>
的函数呢?
答案 0 :(得分:7)
&#34;正确&#34; getRemoteServiceClassType
的签名是
abstract fun getRemoteServiceClassType() : Class<*>
如果可以返回任何类,或
abstract fun getRemoteServiceClassType() : Class<out SuperType>
如果所有服务都应该有一个共同的超类型。有关说明,请参阅https://kotlinlang.org/docs/reference/generics.html。