Изменяемые и неизменяемые классы коллекций совпадают kotlin - PullRequest
2 голосов
/ 12 июля 2020

При использовании отражения для исследования классов коллекций изменяемые и неизменяемые классы для одного и того же типа ссылочно равны.

Почему это так?

    @Test
    fun demonstrate_mutableAndImmutableClassesAreTheSame() {
        println("(MutableIterable::class === Iterable::class) = ${(MutableIterable::class === Iterable::class)}")
        println("(MutableCollection::class === Collection::class) = ${(MutableCollection::class === Collection::class)}")
        println("(MutableList::class === List::class) = ${(MutableList::class === List::class)}")
        println("(MutableSet::class === Set::class) = ${(MutableSet::class === Set::class)}")
        println("(MutableMap::class === Map::class) = ${(MutableMap::class === Map::class)}")
        println("(MutableMap.MutableEntry::class === Map.Entry::class) = ${(MutableMap.MutableEntry::class === Map.Entry::class)}")
    }

печатает

(Iterable :: class === MutableIterable :: class) = true
(Collection :: class === MutableCollection :: class) = true
(List :: class === MutableList :: class) = true
(Set :: class === MutableSet :: class) = true

1 Ответ

1 голос
/ 12 июля 2020

Collection и MutableCollection отображаются в один и тот же класс java .util.Collection (сопоставленные типы), поэтому из точки обзора JVM (после компиляции во время выполнения) они совпадают.

Если вы декомпилируете написанный код, вы получите следующее (я декомпилировал его, используя Kotlin байт-код, сгенерированный Intellij):

Kotlin:

fun demonstrate_mutableAndImmutableClassesAreTheSame() {
    println("(MutableCollection::class === Collection::class) = ${(MutableCollection::class === Collection::class)}")
}

Java:

import kotlin.jvm.internal.Reflection;

// class declaration
public static final void demonstrate_mutableAndImmutableClassesAreTheSame() {
    String var0 = "(MutableCollection::class === Collection::class) = " + (Reflection.getOrCreateKotlinClass(Collection.class) == Reflection.getOrCreateKotlinClass(Collection.class));
    boolean var1 = false;
    System.out.println(var0);
}

Ссылки:

...