请在 Kotlin 中解释此行为:
data class A<T>(val p: T)
class B
fun f1(): A<Number> = A(B()) as A<Number>
fun f2(): A<Unit> = A(B()) as A<Unit>
fun main() {
println("f1: ${f1().p::class.simpleName}") // print "f1: B"
println("f2: ${f2().p::class.simpleName}") // print "f2: Unit"
}
我希望在第一种和第二种情况下输出“B”。
此外,有趣的是,它可以正常工作data class A<T>(val p: T?)
。
这是某种编译器优化吗?
当返回类型声明为 时
Unit
,Kotlin 会应用特定的行为,即强制转换结果为Unit
忽略实际返回值。Kotlin规范中对此进行了说明:强制转换为 kotlin.Unit。
在这一行中
fun f2(): A<Unit> = A(B()) as A<Unit>
,声明了 的类型p
必须是Unit
。因此 Kotlin 丢弃 的实际返回值f2().p
,并将返回值强制转换为Unit
。同样的行为也适用于显式声明返回类型的函数
Unit
这种行为在编写JUnit测试时经常使用,因为 JUnit 不会运行测试方法,除非它们的返回类型是
Unit
。这与 Java 类似,JUnit不会运行测试方法,除非它们的返回类型是void
。关于情况
data class A<T>(val p: T?)
:在的情况下,的类型
p
是,我猜Kotlin区分和,因此不应用强制逻辑。Unit?
A(B()) as A<Unit>
Unit
Unit?