我在
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]
那么,为什么代码会根据其执行方式返回两种不同的结果?
编译器严格遵守“公开声明”类型。 roles
属性的类型为
List
,因此 not可变。因此,您不能向其中添加元素,因为不能保证底层列表实例是可变的。 我认为 Ki
可能更多地用作调试器,并自动检查运行时类型以推断可用的方法。 总结一下:就 Kotlin 语法而言,编译器是严格且正确的,而 Ki 更宽松,因为作为调试器,它会在下面执行额外的检查以简化动态评估。