Найти в Дзене

Измена без декларации – не измена?

В цикле по Kotlin вчера разбирали разнообразные коллекции. Позабавила одна вещь.
Есть типизированный интерфейс Set (да, в Kotlin почему-то не соблюдается на уровне авторов языка такая, казалось бы, общепринятая конвенция, как именование интерфейсов с префиксом I). Это неизменяемое множество. То есть, его один раз присвоили, и всё, методов добавления и удаления там нет. Есть функция setOf, которая создаёт из набора переданных аргументов неизменяемое множество.
Есть типизированный интерфейс MutableSet. Он расширяет интерфейс Set методами добавления и удаления элементов. Есть функция mutableSetOf, которая создаёт из набора переданных аргументов изменяемое множество.
Есть типизированный класс LinkedHashSet, который реализует интерфейс MutableSet и, в дополнение к декларациям этого интерфейса, поддерживает порядок элементов. Есть функция linkedSetOf, которая создаёт из набора переданных аргументов экземпляр такого множества с сохранением порядка.
Так вот.
В текущей реализации Kotlin функция mutableSetOf на самом деле делает то же самое, что и linkedSetOf, только результат выдаёт как интерфейс. То есть без гарантии, что в следующей реализации Kotlin она тоже будет возвращать LinkedHashSet. Ну, это, в принципе, понятно. Должен же возвращаться по факту экземпляр какого-то класса, реализующего интерфейс, так почему бы и не LinkedHashSet. А штепсель в другом.
А именно – в текущей реализации Kotlin функция setOf, которая возвращает типа как неизменяемое множество, таки тоже возвращает LinkedHashSet. То есть, вызов setOf никоим образом не гарантирует, что выданное множество будет неизменяемым, он только говорит, что не гарантирует, что оно будет изменяемым. То есть, возвращает на самом деле изменяемое множество, просто не говорит, что оно на самом деле изменяемое.