gpt4 book ai didi

kotlin - 当被其他伴随对象引用时,密封类的对象神秘地变为空

转载 作者:IT老高 更新时间:2023-10-28 13:36:17 25 4
gpt4 key购买 nike

有一个密封类:

sealed class Alphabet(val name: String) {
object A : Alphabet("A")
object B : Alphabet("B")
object C : Alphabet("C")
object D : Alphabet("D")
object E : Alphabet("E")

companion object {
val array = arrayOf(A, B, C, D, E)
val list = listOf(A, B, C, D, E)
}

override fun toString(): String {
return name
}
}

还有另一个类有伴生对象:

class AlphabetMap {

companion object {
val map = mapOf(
Alphabet.A to 1,
Alphabet.B to 2,
Alphabet.C to 3,
Alphabet.D to 4,
Alphabet.E to 5
)
}
}

如果我想打印数组(或列表):

class AlphabetTest {

@Test
fun printValues() {
Alphabet.array.forEach { print("$it ") };println()
Alphabet.list.forEach { print("$it ") };println()
}
}

它正确打印结果:

A B C D E 
A B C D E

但如果我在代码中初始化 AlphabetMap :

class AlphabetTest {

val m = AlphabetMap()

@Test
fun printValues() {
Alphabet.array.forEach { print("$it ") };println()
Alphabet.list.forEach { print("$it ") };println()
}
}

结果神秘地变成了:

null B C D E 
null B C D E

第一个元素(A)变为空

如果我定义

val m = AlphabetMap

结果是一样的。

如果我在函数中初始化 AlphabetMap:

  @Test
fun printValues() {
val m = AlphabetMap() // or val m = AlphabetMap
Alphabet.array.forEach { print("$it ") };println()
Alphabet.list.forEach { print("$it ") };println()
}

结果是一样的:

null B C D E 
null B C D E

但如果我这样初始化:

  @Test
fun printValues() {
Alphabet.array.forEach { print("$it ") };println()
val m = AlphabetMap() // or val m = AlphabetMap
Alphabet.list.forEach { print("$it ") };println()
}

现在一切正常:

A B C D E 
A B C D E

如果我将 AlphabetMap 重写为

class AlphabetMap {
companion object {
val map = mapOf(
//Alphabet.A to 1,
Alphabet.B to 2,
Alphabet.C to 3,
Alphabet.D to 4,
Alphabet.E to 5
)
}
}

结果变成了

A null C D E 
A null C D E

如果 AlphebetMap 是:

class AlphabetMap {
companion object {
val map = mapOf(
Alphabet.E to 5
)
}
}

结果变成:

A B C D null 
A B C D null

会出什么问题?这是一个错误吗?还是语言功能?

环境:jdk1.8.0_144 , OS X

<kotlin.version>1.2.0</kotlin.version>
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
<kotlin.compiler.incremental>false</kotlin.compiler.incremental>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>

<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-core</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<scope>test</scope>
</dependency>

最佳答案

另一种解决方案是定义 array/list by lazy ,这似乎解决了这里的所有问题。

sealed class Alphabet(val name: String) {
object A : Alphabet("A")
object B : Alphabet("B")
object C : Alphabet("C")
object D : Alphabet("D")
object E : Alphabet("E")

companion object {
val array: Array<Alphabet> by lazy {
arrayOf(A, B, C, D, E)
}
val list: List<Alphabet> by lazy {
listOf(A , B , C , D , E)
}
}

override fun toString(): String {
return name
}
}

现在效果很好。

A B C D E 
A B C D E

关于kotlin - 当被其他伴随对象引用时,密封类的对象神秘地变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47648689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com