如何获得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一样,你可以使用stackTracegetMethodName() 。 请参阅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 ; }