如何在Kotlin中声明可以是字符串或函数的函数参数?

如何在Kotlin中声明可以是字符串或函数的函数参数?

问题描述:

在下面的函数中,我想传递一个html标签的属性。这些属性可以是字符串(test("id", "123"))或功能(test("onclick", {_ -> window.alert("Hi!")})):如何在Kotlin中声明可以是字符串或函数的函数参数?

fun test(attr:String, value:dynamic):Unit {...} 

我试图声明参数valueAny,在科特林根类型。但函数不是Any类型。申报类型为dynamic已经工作,但是

  • dynamic不是一种类型。它只是关闭输入检查参数。
  • dynamic只适用于kotlin-js(Javascript)。

如何在Kotlin(Java)中编写此函数?函数类型与Any有什么关系?是否有包含功能类型和Any的类型?

你可以只重载函数:

fun test(attr: String, value: String) = test(attr, { value }) 

fun test(attr: String, createValue:() -> String): Unit { 
    // do stuff 
} 
+0

是不是有一个为两种类型创建变量的方法?像'var x:dynamic',其中'x'可以是一个字符串或函数? 'X = “foo” 的; x = {print(...)}' – dilvan

你可以写:

fun test(attr: String, string: String? = null, lambda: (() -> Unit)? = null) { 
    if(string != null) { // do stuff with string } 
    if(lambda != null) { // do stuff with lambda } 
    // ... 
} 

,然后调用函数在以下几个方面:

test("attr") 
test("attr", "hello") 
test("attr", lambda = { println("hello") }) 
test("attr") { println("hello") } 
test("attr", "hello", { println("hello") }) 
test("attr", "hello") { println("hello") }