Kotlin 伴随对象列表 NPE 当从另一个伴随对象 fun 调用时 - 当列表在类外部静态初始化时有效?

问题描述 投票:0回答:1

所以我有两个例子给你。

用 NPE 崩溃的一个是这样的:

https://pl.kotl.in/Do3nHlv1S

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 }
    }
}

有效的方法是:

https://pl.kotl.in/KrPlX9Kgp

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 游乐场上则不行,可能是因为编译器插件的原因):

https://pl.kotl.in/TknCpH2kY

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 }
    }
}

这是反编译的崩溃代码:

https://pastebin.com/0pNgn0Ef

这是反编译后的工作代码:

https://pastebin.com/a1KWAWZE

欢迎任何解释吗?谢谢!

android function kotlin nullpointerexception companion-object
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.