Kotlin 键入名称作为值?

Kotlin 键入名称作为值?,kotlin,Kotlin,有人能给我指一下解释以下含义的文档吗?特别是,我想知道为什么可以如图所示使用String和Int val a: Unit = { _: Any -> String }(Int) 最初,我写了以下内容: val a: Unit = { x: Any -> x.toString() }(Unit) 在这两种情况下,我都没有找到正确的文档 键入名称作为值 String和Int是String和Int类的类型(相当于Java的static)。类的名称与其同伴对象的名称同义,即Int或多或少

有人能给我指一下解释以下含义的文档吗?特别是,我想知道为什么可以如图所示使用
String
Int

val a: Unit = { _: Any -> String }(Int)
最初,我写了以下内容:

val a: Unit = { x: Any -> x.toString() }(Unit)
在这两种情况下,我都没有找到正确的文档

键入名称作为值

String
Int
String
Int
类的类型(相当于Java的
static
)。类的名称与其同伴对象的名称同义,即
Int
或多或少与
Int.companion
相同,等等

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

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

{{uu:Any->String}
是一个
(Any)->单元

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

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

因此,这两个函数实际上都不起任何作用

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

{ _: Any -> String }(Int)
在本例中,使用
Int.Companion
…调用该参数,但该参数未使用,因此不重要

你可以写:

val lambda: (Any) -> Unit = { _: Any -> String }
val a: Unit = lambda(Int)
第二个函数对其参数调用
toString
,在本例中为
Unit
Unit
的字符串表示形式,但由于它被分配给
a
,函数的返回类型被推断为
Unit
,因此函数不会返回任何有用的内容


这两个函数都非常无用,因为它们返回
Unit
(即
void
,nothing)。您想实现什么?

让我们分解第一行

{ _: Any -> String }
这是一个lambda。它接受一个参数,该参数被标记为从未使用过,命名为
。此类型的参数被指定为
Any
。lambda返回
String
,该字符串表示(完全为空)。因此,此lambda的类型为
(Any)->String.Companion

{ _: Any -> String }(Int)
这个lambda由它后面的括号调用,传入
Int
,它再次引用了(这个不是空的,它包含常量)。当然,这是有效的,因为
Int.Companion
Any
的子类型,这是预期的参数类型

val a: Unit = { _: Any -> String }(Int)
最后,
a
的声明及其显式
Unit
类型强制lambda将其推断类型从
(Any)->String.Companion
更改为
(Any)->Unit
,以便在调用后返回预期的显式类型


第二行更相似,只是没有伴生对象更简单。

您定义了类型为
(Any)的lambda
{uuu:Any->String}
->String.Companion
并使用
Int.Companion
对象调用它。它总是返回
String.Companion
对象。没有太多意义。以下内容可能更易于阅读:

val func = { _: Any -> String.Companion }
val res = func(Int.Companion)
请注意,
Int
Int.Companion
在这里可以互换使用(也适用于
字符串
一)


有关伴星对象的信息可以在。

Thank@Moira中找到。我只是想更好地理解Kotlin的类型推断。现在,我得到了伴星的
技巧。虽然有点棘手,但还行。但是,我仍然对
(Any)->字符串
值转换成
(Any)感到有点困惑->Unit
。这是否意味着后面有一个
;return kotlin.Unit
(我知道语法是错误的)被添加到λ的末尾?@cuichtlauac是的,基本上就是这样。它忽略返回值并返回
Unit
(或者,从Java的角度来看,
Unit.INSTANCE
,因为它是一个单例)相反,谢谢@zsmb13。在第二种情况下,当将
单元
传递给λ时,我是指
单元。Companion
(类型
任意
)或
kotlin。单元
(类型
单元
)实际上已经是一个单例
对象,因此在这种情况下,您正在引用它的单个实例。