首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin:泛型方法参数的默认值

Kotlin:泛型方法参数的默认值
EN

Stack Overflow用户
提问于 2022-05-18 10:58:50
回答 1查看 52关注 0票数 0

为什么这是正确的,下面的一个是错误的?

更正一

代码语言:javascript
运行
复制
fun main () {
    AppModule().provideHttpClient(CIO)
}

不对

代码语言:javascript
运行
复制
    fun <T : HttpClientEngineConfig> provideHttpClient(engineFactory: HttpClientEngineFactory<T> = CIO): HttpClient

型失配

要求:HttpClientEngineFactory

发现:首席信息干事

CIO的定义为:

代码语言:javascript
运行
复制
public object CIO : HttpClientEngineFactory<CIOEngineConfig> {
    init {
        addToLoader()
    }

    override fun create(block: CIOEngineConfig.() -> Unit): HttpClientEngine =
        CIOEngine(CIOEngineConfig().apply(block))

    override fun toString(): String = "CIO"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-18 11:20:52

泛型方法的语义是“我与任何类型一起工作”,因此泛型方法的类型参数由调用方指定--调用方可以决定什么是T。因此,对于调用方可能传入的任何HttpClientEngineFactory<T>,指定为被调用方的默认值必须与T兼容。

在这里,使用CIO不起作用,因为您正在强迫T成为CIOEngineConfig

想象一下,如果允许CIO的默认值,而调用方允许这样做,会发生什么情况:

代码语言:javascript
运行
复制
AppModule().provideHttpClient<SomeOtherEngineConfig>()

从声明provideHttpClient的方式来看,这应该是可能的--我正在为泛型类型参数T传递SomeOtherEngineConfig,而且由于engineFactory参数具有默认值,所以不需要传递任何其他参数。但是当实际运行时,CIO的默认值将用于HttpClientEngineFactory<SomeOtherEngineConfig>类型的参数!

解决这个问题很容易:只需声明另一个非泛型的provideHttpClient重载:

代码语言:javascript
运行
复制
fun provideHttpClient(): HttpClient = provideHttpClient(CIO)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72287934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档