kotlin - 可变和不可变集合类是同一个 kotlin

标签 kotlin reflection collections jvm mutable

当使用反射来调查集合类时,同一类型的可变类和不可变类在引用上是相等的。
为什么会这样?

    @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

最佳答案

CollectionMutableCollection被映射到同一个 java.util.Collection 类(mapped-types),所以从 JVM 的 POV(在运行时编译之后)来看它们是相同的。
如果你反编译你写的代码,你会得到这个(我已经使用 Intellij 生成的 Kotlin Bytecode 反编译了它):
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);
}
引用:
  • https://kotlinlang.org/docs/reference/java-interop.html#mapped-types
  • (imutable collection is mutable) returns true in Kotlin
  • Kotlin make constructor of data class accept both List and MutableList but store a mutable instance of them
  • 关于kotlin - 可变和不可变集合类是同一个 kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62863638/

    相关文章:

    java - 如何在不使用@GlideModule 的情况下添加超时以在库模块中滑动

    kotlin - 如何将 Class<T>#cast 方法从 Java 转换为 Kotlin?

    java - Kotlin 推断不遵循正常 getter/setter 约定的 Java 类属性?

    java - 如何将数组列表转换为数组?

    C# 集合类 - 是或否

    spring - Autowire FeignClient 跨 maven 项目

    java - 如何使用 java 反射创建 protobuf 实例?

    c# - 检查 T 泛型类型是否具有 C# 中的属性 S(泛型)

    java - 使用反射的通用类类型父级

    c# - 在 DataGridView 中隐藏行,绑定(bind)在我的项目中不起作用