有人可以向我指出解释以下内容的文件吗?特别是,我想知道为什么String
和Int
可以如图所示使用。
val a: Unit = { _: Any -> String }(Int)
最初,我写过:
val a: Unit = { x: Any -> x.toString() }(Unit)
在这两种情况下,我都找不到合适的文档。
答案 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)
输入名称作为值?
String
和Int
是static
和String
类的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
,在本例中为Unit
。 Unit
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)
请注意,此处Int
和Int.Companion
可互换使用(也适用于String
)。
有关配套对象的信息,请参阅documentation。