可变列表的行为在 kotlinc 和 REPL ki 中有所不同

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

我在

kotlinc
ki
(github)

中运行了以下代码
data class Person(val name: String, val roles: List<String>)

val m = Person("bob", mutableListOf("developer"))
m.roles.addFirst("a")

kotlinc
中,我收到一条错误消息:

 > kotlinc -script Immutable.kts 
Immutable.kts:4:9: error: unresolved reference 'addFirst'.
m.roles.addFirst("a")
        ^

但是,

ki
允许我修改可变列表
roles

> ki
ki-shell 0.5.2/1.7.0
type :h for help
[0] data class Person(val name: String, val roles: List<String>)
[1] val m = Person("bob", mutableListOf("developer"))
[2] m.roles.addFirst("a")
[3] m.roles
res3: List<String> = [a, developer]

那么,为什么代码会根据其执行方式返回两种不同的结果?

kotlin
1个回答
0
投票

编译器严格遵守“公开声明”类型。 roles 属性的类型为

List
,因此
not
可变。因此,您不能向其中添加元素,因为不能保证底层列表实例是可变的。 我认为

Ki

可能更多地用作调试器,并自动检查运行时类型以推断可用的方法。 总结一下:就 Kotlin 语法而言,编译器是严格且正确的,而 Ki 更宽松,因为作为调试器,它会在下面执行额外的检查以简化动态评估。

© www.soinside.com 2019 - 2024. All rights reserved.