van_kalsing
06/08/2017, 1:21 AMfun main(args: Array<String>) {
val s = setOf(1, 2, 3)
val h = s as java.util.LinkedHashSet
h.add(4)
println(s) // Выводит [1, 2, 3, 4]
}
Вот подстава. Плохо, что в документации такое поведение не освещено. Более того, утверждается, что setOf возвращает неизменяемую коллекцию... Я, конечно, догадываюсь, что так сделано дабы не раздувать рантайм и сделать прозрачной работу из джавы. Правильно догадываюсь?
Что-то для исправления ситуации производится? Какие еще есть способы повлиять на поведение кода извне (и изнутри) модуля (кроме рефлексии)? Можно ли, например, отнаследоваться от sealed класса, не из того же файла (проверить сейчас возможности нет)?y2k_
06/08/2017, 5:53 AMsnrostov
06/08/2017, 7:07 AMБолее того, утверждается, что setOf возвращает неизменяемую коллекцию..Returns a new read-only set with the given elements. Разве неизменяемую? Написано только для чтения, а это не одно и тоже.
miha-x64
06/08/2017, 8:06 AMCollections.unmodifiableList()
.
У самого sealed-класса синтетический конструктор — из Java никак не унаследовать. Можно унаследовать его не-финальный подкласс ( ☕ class C extends B
/ K open class B : A()
/ K sealed class A
).van_kalsing
06/08/2017, 1:25 PMThe toList extension method just duplicates the lists items, thus, the returned list is guaranteed to never change.
Фраза Returns a new read-only set with the given elements.
тоже двусмысленная. Имелось ввиду: возвращается экземпляр интерфейса, не определяющего механизмы модификации, а читается как: возвращает множество из которого мы можем только читать, но не писать.
Хотя, зная, что происходит на деле, все такие фразы можно прочитать правильно. Но при первом знакомстве они могут восприниматься превратно. В общем претензии у меня остались только к документации за двусмысленность