所以我有两个例子给你。
用 NPE 崩溃的一个是这样的:
fun main() {
val instance = Test.First
val found = Test.findFromKey(instance.key)
println("${found!!.key}")
}
sealed class Test(val key: String) {
object First : Test("First")
object Second : Test("Second")
companion object {
val firstAndSecond = listOf(Test.First, Test.Second)
fun findFromKey(key: String): Test? = firstAndSecond.firstOrNull { it.key == key }
}
}
有效的方法是:
fun main() {
val instance = Test.First
val found = Test.findFromKey(instance.key)
println("${found!!.key}")
}
sealed class Test(val key: String) {
object First : Test("First")
object Second : Test("Second")
companion object {
fun findFromKey(key: String): Test? = firstAndSecond.firstOrNull { it.key == key }
}
}
val firstAndSecond = listOf(Test.First, Test.Second)
那么这里发生了什么?我认为伴生对象及其内容是用类静态初始化的,就像在 Java 中声明静态的东西一样。另外,当我像这样添加
@JvmStatic
注释时,它也可以工作(当我在 Android Studio 中执行此操作时,这是有效的,但在在线 Kotlin 游乐场上则不行,可能是因为编译器插件的原因):
fun main() {
val instance = Test.First
val found = Test.findFromKey(instance.key)
println("${found!!.key}")
}
sealed class Test(val key: String) {
object First : Test("First")
object Second : Test("Second")
companion object {
@JvmStatic
val firstAndSecond = listOf(Test.First, Test.Second)
fun findFromKey(key: String): Test? = firstAndSecond.firstOrNull { it.key == key }
}
}
这是反编译的崩溃代码:
这是反编译后的工作代码:
欢迎任何解释吗?谢谢!