输入名称作为值?

有人可以指点我解释以下内容的文件吗? 特别是,我想知道为什么可以使用StringInt ,如图所示。

 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.CompanionAny一个子types,它是预期的参数types。

 val a: Unit = { _: Any -> String }(Int) 

最后,声明a及其显式的Unittypes强制lambda从(Any) -> String.Companion将其推断types更改为(Any) -> Unit ,因此它可以在被调用后返回期望的显式types。

第二行是更多的相同,只有简单的没有伴侣对象。

输入名称作为值?

StringIntStringInt类的伴随对象 (类似于Java的static类)。 一个类的名字与它的伴侣对象的名字是同义的,也就是说, Int或多或少和Int.Companion是一样的。

{ _:Any -> String }{ x:Any -> x.toString() }都是types为(Any) -> String.Companion(Any) -> String lambdaexpression式 ,但是由于函数调用的结果被分配给atypes为Unit函数,这两个函数都被推断为返回Unit

基本上,经过types推断:

{ _:Any -> String }是一个(Any) -> Unit

{ x:Any -> x.toString() }也是一个(Any) -> Unit

这个types对应于Java中的voidtypes。

文件:单位

所以这些function都无能为力。

第一个函数(types为(Any) -> Unit接受一个参数(未使用)并返回String.Companion

在这种情况下,它被称为Int.Companion …但参数是未使用的,所以没关系。

你可以写:

 val lambda: (Any) -> Unit = { _: Any -> String } val a: Unit = lambda(Int) 

第二个函数调用toString参数,在这个例子中是UnitUnit的字符串表示被定义为"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) 

请注意, IntInt.Companion在这里可以互换使用(也适用于String一个)。

关于伴侣对象的信息可以在文档中find。