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
相关产品推荐
相关产品推荐

