Почему реализация Set в Котлине изменчива под капотом?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему реализация Set в Котлине изменчива под капотом?

Сообщение Anonymous »

Я только что заметил кое-что интересное о структуре данных Kotlin Set и ее взаимодействии с Java.
Сначала рассмотрим объект List. Если у меня есть этот код в Kotlin:

Код: Выделить всё

private val aList = listOf(1,2,3)
fun giveMeAList() = aList

fun printAList() = println(aList)
и это на Java:

Код: Выделить всё

List aList = TestKotlin.INSTANCE.giveMeAList();
TestKotlin.INSTANCE.printAList(); // [1,2,3]
aList.add(4); // UnsupportedOperationException
TestKotlin.INSTANCE.printAList();
Я получаю исключение UnsupportedOperationException в файле .add. Это ожидаемо, поскольку внутри это (неизменяемый) список. Но поскольку он соответствует интерфейсу List, а в Java нет концепции неизменяемых коллекций, компилятор этого не обнаруживает и во время выполнения происходит сбой.
Но теперь рассмотрим идентичный код Kotlin, за исключением замены типов List на Set. Затем этот Java код:

Код: Выделить всё

Set aSet = TestKotlin.INSTANCE.giveMeASet();
TestKotlin.INSTANCE.printASet(); // (1, 2, 3)
aSet.add(4); // no exception thrown
TestKotlin.INSTANCE.printASet(); // (1, 2, 3, 4)

Исключения не создаются. Как и List, Kotlin различает изменяемые и неизменяемые Set. В Котлине нет aSet.add. Почему множества не ведут себя одинаково? Это намеренно? Это что-то, что нельзя будет изменить «под капотом» в будущей версии Kotlin?

Подробнее здесь: https://stackoverflow.com/questions/787 ... r-the-hood

Вернуться в «JAVA»