我是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()
})
}
不幸的是,静态编程语言在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