You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中能否将无参函数适配传入带参函数类型的构造参数?

问题描述

有如下Kotlin代码声明:

abstract class Foo<K, V>(
    val bar: (K) -> V
)

fun lotsOfFun() = 42

能否将无参函数(例如lotsOfFun)传入bar参数的位置以匹配类型?类似如下写法:

class Derived: Foo<???, Int>(::lotsOfFun)
解答

完全可以。Kotlin支持函数类型的兼容性适配:无参函数可以被当作接收任意数量额外参数的函数类型使用——这些额外传入的参数会被直接忽略,只要返回值类型匹配即可。

针对泛型参数K,你可以选择以下几种常见方式:

方式1:指定K为Unit

class Derived: Foo<Unit, Int>(::lotsOfFun)

后续调用bar时,只需传入Unit值即可触发执行:derived.bar(Unit),lotsOfFun会正常返回42。

方式2:指定K为Nothing?

class Derived: Foo<Nothing?, Int>(::lotsOfFun)

Nothing?类型仅包含null这一个有效值,用它作为K的类型,能明确表示bar函数不会接收任何实际有效的参数,更贴合无参函数的使用场景。

原理

::lotsOfFun的原始类型是() -> Int,而Foo要求的bar参数类型是(K) -> Int。由于两者返回值类型一致,编译器会自动将无参函数包装成接收一个参数的函数,执行时直接忽略传入的参数,调用原无参函数。

内容的提问来源于stack exchange,提问作者TomekK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:04:58