簡體   English   中英

kotlin,如何從函數返回類類型

[英]kotlin, how to return class type from a function

具有基類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>

}

為什么不能為Class<T>返回IBService::java.class ,而是將IBService::class.java傳遞給需要Class<T>的函數?

getRemoteServiceClassType的“正確”簽名是

abstract fun getRemoteServiceClassType() : Class<*>

如果任何課程都可以退還,或者

abstract fun getRemoteServiceClassType() : Class<out SuperType>

如果所有服務都應該有一個共同的超類型。 有關說明,請參閱https://kotlinlang.org/docs/reference/generics.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM