如何获得kotlin函数的调用者

时间:2017-05-26 03:17:07

标签: 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为了清晰起见而对其进行编辑。

  

我的最终目标是返回来电者的类型并且可以调用此来电者的实例属性,不再是,不再覆盖,任何想法?

5 个答案:

答案 0 :(得分:1)

就像java一样,您可以使用stackTrace的{​​{1}}。请参阅kotlin doc

答案 1 :(得分:0)

open class Parent{
    open fun foo(): Parent {
        return this;
    }
}

这是您的Parent课程。 Parent类有一个名为foo()的方法。 foo()是A类的一种方法,它将返回它自己的类的实例。我们必须打开类和方法,因为默认情况下它们的可见性修饰符是最终的。

class A : Parent() {
    override fun foo(): A { return this }
}

这是一个名为A的类,它扩展了Parent类。 foo()是A类的一种方法,它将返回它自己的类的实例。

我们将这样称呼:

var a = A().foo().foo()

答案 2 :(得分:0)

您的示例正常工作(如果您添加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()返回没有子类属性的父类。所以你需要将它强制转换为子类。(更新代码)

答案 3 :(得分:0)

您的班级总是返回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 = "";
}

答案 4 :(得分:-2)

我知道怎么做:

@Avijit Karmakar

@TrầnĐứcTâm

使用 内联功能

 inline fun <reified T:Any> some(sql: String):T {

        return this as T ;
    }