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

Kotlin中Test接口关联的两种函数声明方式fun1与fun2的区别是什么

Kotlin 中 fun1 和 fun2 的核心区别

你代码里的两个函数本质定位完全不同:

  • fun1 是 Test 接口的接口成员函数
  • fun2 是 Test 接口的扩展函数

二者具体差异如下:

  • 归属不同
    fun1 属于 Test 接口本身的结构组成部分,会纳入接口的成员列表,所有实现 Test 接口的类都默认继承这个函数。fun2 不属于接口的原生成员,是在接口外部新增的扩展能力,不会修改接口本身的定义。
  • 重写规则不同
    fun1 支持被 Test 的实现类重写,调用时遵循虚函数动态分派规则,运行时会根据实例的实际类型调用对应实现。fun2 不支持重写,是静态分派的,调用结果只取决于变量的声明类型,和实例的实际类型无关。
  • 调用要求不同
    只要是 Test 接口的实现类实例,无需额外操作就可以直接调用 fun1。fun2 必须先导入它所在的包路径才能调用,否则无法识别。
  • 底层实现不同
    fun1 是常规的接口虚方法,底层会存在于类的虚方法表中。fun2 本质是一个顶层函数,编译后会生成一个入参为 Test 类型实例的静态方法,调用时只是把调用方实例作为参数传入这个静态方法而已。

你可以参考下面的测试代码验证差异:

class TestImpl : Test {
    // 仅重写fun1
    override fun fun1(): Boolean = true
}

fun main() {
    val test: Test = TestImpl()
    println(test.fun1()) // 输出true,调用TestImpl重写的实现
    println(test.fun2()) // 输出true,始终调用Test的扩展函数实现
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:54:06