方法参考超类方法

时间:2017-10-25 18:30:17

标签: kotlin super method-reference

如何使用方法引用来引用超类方法?

在Java 8中,您可以SubClass.super::method

Kotlin的语法是什么?

期待您的回复!

结论

感谢Bernard Rocha! 语法为SubClass::method

但要小心。在我的例子中,子类是一个泛型类。不要忘记将其声明为:

MySubMap<K, V>::method

修改

它仍然无法在Kotlin中使用。

她是Java 8中对超类方法的方法引用的一个例子:

public abstract class SuperClass {
    void method() { 
        System.out.println("superclass method()");
    }
}

public class SubClass extends SuperClass {
    @Override
    void method() {
        Runnable superMethodL = () -> super.method();
        Runnable superMethodMR = SubClass.super::method;
    }
}

我仍然无法在Kotlin做同样的事情......

修改

这是我在Kotlin中尝试实现它的一个例子:

open class Bar {
    open fun getString(): String = "Hello"
}

class Foo : Bar() {

    fun testFunction(action: () -> String): String = action()

    override fun getString(): String {
        //this will throw an StackOverflow error, since it will continuously call 'Foo.getString()'
        return testFunction(this::getString)
    }
}

我希望有类似的东西:

...
    override fun getString(): String {
        //this should call 'Bar.getString' only once. No StackOverflow error should happen.
        return testFunction(super::getString)
    }
...

结论

在Kotlin还没有这样做。

我提交了一份专题报道。可在此处找到:KT-21103 Method Reference to Super Class Method

3 个答案:

答案 0 :(得分:3)

正如documentation says所使用的那样,如java:

  

如果我们需要使用类的成员或扩展函数,它   需要合格。例如String :: toCharArray为我们提供了扩展   类型为String的函数:String。() - &gt; CharArray。

修改

我认为你可以达到你想做的事情:

open class SuperClass {
    companion object {
        fun getMyString(): String {
            return "Hello"
        }
    }
}

class SubClass : SuperClass() {
    fun getMyAwesomeString(): String {
        val reference = SuperClass.Companion
        return testFunction(reference::getMyString)
    }

    private fun testFunction(s: KFunction0<String>): String {
        return s.invoke()
    }
}

答案 1 :(得分:1)

根据贝尔纳多的回答,你可能会有这样的事情。它没有显着的变化。

fun methodInActivity() {
    runOnUiThread(this::config)
}

fun config(){

}

此外,在传入的1.2版本中,您只能使用

::config

答案 2 :(得分:0)

不知道是否可以获得对超类功能的引用,但这里有一个替代你想要实现的目标:

override fun getString(): String = testFunction { super.getString() }