如何获得kotlin函数的调用者
有了这个例子:
open class Parent { fun some():Parent { return this; } } class A : Parent(){ val name:String? = null; }
但是这个代码会导致一个错误:
val a = A().some().some() a.name // ERROR
编者注: 根据作者对下面的答案的评论,这个问题不是关于引用a.name
而是关于类似于“如何获得类的实例或其名称首先启动方法调用链” 。 请阅读下面的所有评论,直到OP为了清晰起见而编辑。
我的最终目标是返回调用者的类型,并可以调用这个调用者的实例属性,没有更多的重写,任何想法?
你的例子很有用(如果你添加open
关键字,因为默认情况下,Kotlin中的所有类都是最终的:
A.kt
open class A { fun some(): A { return this } }
B.kt
class B : A() { val test = "test" }
和用法
val tmpB = (B().some().some() as B) val test = tmpB.test
编辑:因为函数some()返回没有子类属性的父类。 所以你需要把它转换成子类(更新代码)
就像java一样,你可以使用stackTrace
的getMethodName()
。 请参阅kotlin文档 。
open class Parent{ open fun foo(): Parent { return this; } }
这是你的Parent
类。 Parent
类有一个名为foo()
的方法。 foo()
是类A的一个方法,它将返回它自己的类的实例。 我们必须打开类和方法,因为默认情况下它们的可见性修饰符是最终的。
class A : Parent() { override fun foo(): A { return this } }
这是一个扩展了Parent
类的名为A
类。 foo()
是类A的一个方法,它将返回它自己的类的实例。
我们将这样称呼它:
var a = A().foo().foo()
你的类总是返回Parent
实例。 这个类没有任何名称的name
。 要做到这一点,你有两种方法:
首先:
open class Parent{ fun some():Parent{ return this } } class A :Parent(){ val name:String? = null } fun main() { val a = (A().some().some() as A) a.name = ""; }
第二:
open class Parent{ open fun some():Parent{ return this } } class A :Parent(){ override fun some():A { return this } val name:String? = null } fun main() { val a = A().some().some() a.name = ""; }
我知道如何做到这一点:
@Avijit Karmakar
@TrầnĐứcTâm
使用内联函数
inline fun <reified T:Any> some(sql: String):T { return this as T ; }