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

时间:2018-06-11 18:39:47

标签: class kotlin retrofit2

具有基类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>的函数呢?

1 个答案:

答案 0 :(得分:7)

&#34;正确&#34; getRemoteServiceClassType的签名是

abstract fun getRemoteServiceClassType() : Class<*>

如果可以返回任何类,或

abstract fun getRemoteServiceClassType() : Class<out SuperType>

如果所有服务都应该有一个共同的超类型。有关说明,请参阅https://kotlinlang.org/docs/reference/generics.html