输入名称作为值?
有人可以指点我解释以下内容的文件吗? 特别是,我想知道为什么可以使用String
和Int
,如图所示。
val a: Unit = { _:Any -> String }(Int)
最初,我写了这个:
val a: Unit = { x:Any -> x.toString() }(Unit)
在这两种情况下,我都找不到合适的文档。
我们来分解第一行。
{ _: Any -> String }
这是一个lambda。 它需要一个参数,它被标记为从未使用的名称_
。 这个types的参数被指定为Any
。 lambda返回String
,它引用String
类中的(完全为空) companion object
。 这个lambda的types是(Any) -> String.Companion
。
{ _: Any -> String }(Int)
这个lambda被调用后面的圆括号,传入Int
,它又指那个类内的companion object
(这个不是空的,它包含常量)。 这是有效的,因为当然, Int.Companion
是Any
一个子types,它是预期的参数types。
val a: Unit = { _: Any -> String }(Int)
最后,声明a
及其显式的Unit
types强制lambda从(Any) -> String.Companion
将其推断types更改为(Any) -> Unit
,因此它可以在被调用后返回期望的显式types。
第二行是更多的相同,只有简单的没有伴侣对象。
输入名称作为值?
String
和Int
是String
和Int
类的伴随对象 (类似于Java的static
类)。 一个类的名字与它的伴侣对象的名字是同义的,也就是说, Int
或多或少和Int.Companion
是一样的。
{ _:Any -> String }
和{ x:Any -> x.toString() }
都是types为(Any) -> String.Companion
和(Any) -> String
lambdaexpression式 ,但是由于函数调用的结果被分配给a
types为Unit
函数,这两个函数都被推断为返回Unit
。
基本上,经过types推断:
{ _:Any -> String }
是一个(Any) -> Unit
{ x:Any -> x.toString() }
也是一个(Any) -> Unit
这个types对应于Java中的
void
types。文件:单位
所以这些function都无能为力。
第一个函数(types为(Any) -> Unit
接受一个参数(未使用)并返回String.Companion
。
在这种情况下,它被称为Int.Companion
…但参数是未使用的,所以没关系。
你可以写:
val lambda: (Any) -> Unit = { _: Any -> String } val a: Unit = lambda(Int)
第二个函数调用toString
参数,在这个例子中是Unit
。 Unit
的字符串表示被定义为"kotlin.Unit"
,但是因为它被分配给a
函数的返回types被推断为Unit
,所以该函数不会返回任何有用的东西。
这些函数在返回Unit
是无用的(即void
,Nothing)。 你想要完成什么?
您定义了一个types为(Any)-> String.Companion
的lambda { _: Any -> String }
,并用Int.Companion
对象调用它。 它总是返回String.Companion
对象。 没有多大意义。 以下可能更具可读性:
val func = { _: Any -> String.Companion } val res = func(Int.Companion)
请注意, Int
和Int.Companion
在这里可以互换使用(也适用于String
一个)。
关于伴侣对象的信息可以在文档中find。