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

