输入名称作为值?

时间:2018-01-29 16:36:21

标签: kotlin

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

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

最初,我写过:

val a: Unit = { x: Any -> x.toString() }(Unit)

在这两种情况下,我都找不到合适的文档。

3 个答案:

答案 0 :(得分:6)

让我们分解第一行。

{ _: Any -> String }

这是一个lambda。它需要一个参数,通过给它命名_标记为从未使用过。此类型的参数指定为Any。 lambda返回String,它引用(完全空)companion object inside the String class。因此,此lambda的类型为(Any) -> String.Companion

{ _: Any -> String }(Int)

这个lambda由括号后面调用,传入Int,再次引用companion object inside that class(这个不是空的,它包含常量)。这是有效的,因为Int.Companion当然是Any的子类型,是预期的参数类型。

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

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

第二行更相似,只有在没有伴随对象的情况下才更简单。

答案 1 :(得分:4)

  

输入名称作为值?

StringIntstaticString类的companion objects(相当于Java的Int)。类的名称与其伴随对象的名称是同义词,即Int或多或少与Int.Companion等相同。

{ _:Any -> String }{ x:Any -> x.toString() }都是(Any) -> String.Companion(Any) -> String类型的lambdas,但由于函数调用的结果已分配给a },类型为Unit,这些函数都被推断为返回Unit

基本上,在类型推断之后:

{ _:Any -> String }(Any) -> Unit

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

  

此类型对应于Java中的void类型。

     

<子> Documentation: Unit

所以这些功能都无济于事。

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

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

你可以写:

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

第二个函数在其参数上调用toString,在本例中为UnitUnit is defined as "kotlin.Unit"的字符串表示形式,但由于它被赋值给a,因此函数的返回类型被推断为Unit,因此该函数不会返回任何有用的内容。

这些函数都没有用,因为它们返回Unit(即void,没有)。你想要完成什么?

答案 2 :(得分:3)

您定义了{ _: Any -> String }类型的(Any)-> String.Companion,并使用Int.Companion对象调用它。它总是返回String.Companion对象。没有多大意义。以下内容可能更具可读性:

val func = { _: Any -> String.Companion }
val res = func(Int.Companion)

请注意,此处IntInt.Companion可互换使用(也适用于String)。

有关配套对象的信息,请参阅documentation