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。单元
(类型单元
)实际上已经是一个单例对象,因此在这种情况下,您正在引用它的单个实例。