【问题标题】:kotlin, how to return class type from a functionkotlin,如何从函数返回类类型
【发布时间】: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&lt;T&gt;

希望在基 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&lt;T&gt; 返回IBService::java.class,而是将IBService::class.java 传递给需要Class&lt;T&gt; 的函数?

【问题讨论】:

  • override fun&lt;T&gt; getRemoteServiceClassType() : Class&lt;T&gt; { 这个函数定义说这个函数的作用是你可以为 any T 请求Class&lt;T&gt;,而不是IBService 的一些T选择。

标签: class kotlin retrofit2


【解决方案1】:

getRemoteServiceClassType 的“正确”签名是

abstract fun getRemoteServiceClassType() : Class<*>

如果任何类都可以返回,或者

abstract fun getRemoteServiceClassType() : Class<out SuperType>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2018-08-12
    相关资源
    最近更新 更多