功能接口在Kotlin中调用

时间:2019-09-02 03:22:52

标签: kotlin

我是Kotlin的新手,我总是写Java。 我通过kotlin以Java方式尝试了一些功能代码,但是没有用。

我将这些代码翻译成Java,并且可以正常工作。

fun doIt(content: String, fInter: FInter) {
    fInter.doItForString(content)
}

@FunctionalInterface
interface FInter {
    fun doItForString(string: String)
}

fun main() {

    doIt("abc") {
        println(it) // why it error
    }

}

即使FInter是Java接口也是如此。也不行。


更新

摘要

我以不同的方式尝试,现在它们可以工作了。

package com.linuxea.javalin

/**
 * @author linuxea
 * @date 2019/9/2 11:58
 */

@FunctionalInterface
interface StringHandler {
    fun handle(content: String): String
}

class ToUpperCaseStringHandler : StringHandler {

    override fun handle(content: String): String {
        return content.toUpperCase()
    }

}

fun go(string: String, stringHandler: StringHandler) {
    println(stringHandler.handle(string))
}


fun go(string: String, stringHandler: (String) -> String) {
    println(stringHandler(string))
}

fun main() {
    go("abc", ToUpperCaseStringHandler())

    go("dfalkdjkskf") {
        it.toLowerCase()
    }

    go("abcdefg") {
        println(it)
        it.toUpperCase()
    }

    // lambda argument should be moved out of parentheses
    go("xyz", {
        it.toUpperCase()
    })
}

1 个答案:

答案 0 :(得分:1)

不幸的是,Kotlin在SAM接口上的工作不是很好。对于Java接口,您可以这样使用它:

// Java
public interface FInter {
    void doItForString(String string);
}

// Kotlin
fun main() {
    doIt("abc", FInter { println(it) })
}

但是您也可以使用函数类型(String) -> Unit代替接口:

fun doIt(content: String, fInter: (String) -> Unit) {
    fInter(content)
}

fun main() {
    doIt("abc") {
        println(it)
    }
}