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

Kotlin中如何将pew()定义在类A中仍支持链式调用b.pew().pew2()

可以实现,核心是要保证pew()方法的返回值类型匹配实际调用该方法的子类类型,而非固定为父类A的类型,两种常见实现方式如下:

方式1:类内声明带泛型约束的成员扩展函数

这种写法和原有扩展函数逻辑完全一致,只是把扩展函数的定义位置移到了A类内部,调用时泛型会自动推导为实际的子类类型:

open class A() { 
    // 声明泛型上界为A,接收者为泛型类型实例,返回自身
    fun <T : A> T.pew(): T = apply { }
}

class B(): A() { 
   fun pew2() { }
}

fun main() {
    val b = B()
    b.pew().pew2() // 可正常调用,无需额外嵌套apply
}

方式2:通过递归泛型约束父类实现

如果不想用成员扩展函数,可以在定义父类时增加递归泛型约束,子类继承时传入自身作为泛型实参,就能让父类方法直接返回子类类型:

// 泛型上界约束为A的子类
open class A<T : A<T>> {
    fun pew(): T = this as T
}

// 子类继承时传入自身作为泛型实参
class B(): A<B>() { 
   fun pew2() { }
}

fun main() {
    val b = B()
    b.pew().pew2() // 可正常调用
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:24:00