当前位置: 首页 > 知识库问答 >
问题:

kotlin中的函数接口调用

司徒俊良
2023-03-14

我是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个答案

端木明贤
2023-03-14

不幸的是,静态编程语言在SAM接口上不太好用。对于Java接口,您可以这样使用它:

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

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

但是您也可以使用函数类型(String)-

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

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

 类似资料:
  • 本文向大家介绍Kotlin中的sam(函数式接口)详解,包括了Kotlin中的sam(函数式接口)详解的使用技巧和注意事项,需要的朋友参考一下 用lambda表达式去表示java中的匿名类实例 在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如下 在kotlin我们可以通过传递一个lambda表达式去代替这个实例 可以以这种方式去实现的原因是OnClickListener接口只有一

  • 从Kotlin调用Java代码时,存在SAM转换,因此Java代码如下所示: 可以如下所示: 现在,我正在处理一个Kotlin项目,我想将功能接口定义为事件侦听器: 在SomeClass中,我有一个设置监听器的函数: 当我创建这个类的实例并尝试调用setter函数时,我是这样做的: 我知道静态编程语言有函数类型,因此不支持来自各种站点的SAM转换,例如这个站点。 我读过一些关于函数类型的书,但我以

  • 我正在将我的一些Java代码转换为Kotlin,我不太明白如何实例化Kotlin代码中定义的接口。作为一个例子,我有一个接口(用Java代码定义): 然后在我的Kotlin代码中,我进一步实例化了这个接口: 而且效果很好。然而,当我将MyInterface转换为Kotlin时: 当我尝试实例化接口MyListener时,我得到了一条错误消息:-尽管在我看来除了语法之外没有什么变化。我是否误解了Ko

  • 这是我在编写java时从未考虑过的,因为我使用这个模式时没有任何问题: 这样做效果很好,因为重写的函数不依赖于任何未初始化的数据,但是它们对于每个派生的都是唯一的(因此需要抽象)。这在科特林也有效,但它仍然给出了警告。 那么在Java/Kotlin中这种做法是不是很糟糕呢?如果有,我该如何改进?是否可以在kotlin中实现而不被警告在构造函数中使用非final函数? 一个可能的解决方案是将行移动到

  • 我想为实现接口的类中的函数参数使用默认值,如下所示: 现在这里是编译的,这里是不编译的: KO:不允许重写函数为其参数指定默认值 KO:类“LocalFileStoreService”不是抽象的,并且没有实现抽象成员公共抽象存储文件(路径:String,负载:InputStream,类型:MediaType):fqn中定义的单元。。。文件存储服务 好 啊: 这是预期的行为吗?有没有更好的方法来管理

  • 主要内容:实例,实例,函数重写,实例Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现: interface MyInterface { fun bar() // 未实现 fun foo() { //已实现 // 可选的方法体 println("foo") } } 实现接口 一个类或者对象可以实现一个或多个接口。 class Child : MyInterface { overri