我是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()
})
}
答案 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)
}
}