LinkedHashMap 在 Kotlin 中创建了什么?

What does a LinkedHashMap create in Kotlin?

我是 Kotlin 的新手,在文档中遇到过很多实例,其中 commonjsnativejvm 标签列出了不同的 return值或 class 类型。谁能解释一下这到底是什么意思?

这是一个例子:

我的两个问题是:

  1. classtypealiasopen class 有何不同?
  2. 为什么他们似乎 return 不同的价值观来创造同样的东西?

首先,文档中的大部分信息在 JVM 上都是不相关的。如果你输入 LinkedHashMap<String, String>(),你实际上(因为 JVM 只有类型别名)创建了一个 java.util.LinkedHashMap,因此 kotlin 的 LinkedHashMap 在 JVM 上“实现”的方式是使用 java built-in。然而,如果你调用 linkedMapOf,你会得到一个 kotlin.collections.LinkedHashMap class 的实例,但如果你查看反射类型 (::class),它实际上是还是一个java.util.LinkedHashMap!因此,我们可以得出以下结论:

  1. 在 JVM 上,使用 java stdlib 的集合类型(因为编译器将对 kotlin 集合的构造函数调用更改为对 java 集合的调用)
  2. 存在一个通用的 class 或接口,因此您不必在不同的平台上编写不同的代码,但是在运行时可能会使用不同的类型。
  3. 使用JS时,LinkedHashMap可以被重写(因为是open),它是预期的LinkedHashMap类型的“实现者”
  4. 使用本机目标时,因为在使用普通 HashMap 时保留了顺序,所以 LinkedHashMap 指向那里,因为没有理由使用链接 hashmap 而不是普通 hashmap

编辑:刚刚意识到我没有真正回答你的问题:

  1. a class 只是你的常规 oop class,但它不能被覆盖,因为它是开放的,typealias 意味着当你引用某个类型时它实际上“指向”一个不同的类型(您可以将其视为类型重命名或重新导出),并且打开的 class 是 class 可以是 extended/overridden
  2. 因为 platform-specific 实施。这种结构或 expect + actual 可以让你为所有平台编写通用代码,而不必担心个别平台。

我希望这能回答你的问题,如果你有更多的问题,请告诉我。

文档告诉您在不同平台上编写代码时,LinkedHashMap 的声明应该是什么样子 - Kotlin/JS、Kotlin/JVM、Kotlin/Native . “共同”声明是其他三者的“交集”——三者之间的“共同”事物,这在您编写 cross-platform 代码时很有用。

详细解释每一个(注意所有 3 个平台都是通用的“超集”):

常见:

class LinkedHashMap<K, V> : MutableMap<K, V>

LinkedHashMap 是一个 class,它有两个泛型参数 KV,它实现了 MutableMap<K, V>.

JVM:

typealias LinkedHashMap<K, V> = LinkedHashMap<K, V>

LinkedHashMap<K, V>typealias(即另一个名称)用于 Java 的 java.util.LinkedHashMap<K, V> class。包名称 java.util 并未在文档中显示,这可能会造成混淆,但您可以单击 link 查找 :)

请注意,java.util.LinkedHashMap<K, V> 实现了 java.util.Map<K, V>,当它移植到 Kotlin 时,意味着它实现了 MutableMap<K, V>。 (我这么说是因为这是common declaration里面的东西之一)

JS:

open class LinkedHashMap<K, V> : 
    HashMap<K, V>, 
    MutableMap<K, V>

LinkedHashMap 是一个 class,它有两个通用参数 KV,它实现了 MutableMap<K, V>。也是继承自HashMap<K, V>,而且是open,也就是说可以继承

母语:

typealias LinkedHashMap<K, V> = HashMap<K, V>

LinkedHashMap<K, V> 只是 HashMap<K, V> 的另一个名字(这次是 Kotlin 的 kotlin.collections.HashMap,而不是 Java。点击 link 查看.) 另请注意,HashMap<K, V> 也实现了 MutableMap<K, V>

Why do they seem to return different values for creating the same thing?

这些不是函数,它们 return 什么也不是。这些是 class LinkedHashMap 声明 ,某些平台可能会以不同的方式声明它们,因为它们是不同的平台!例如,为什么 Kotlin/JVM 会创建一个全新的 LinkedHashMap,而 JDK 中已经有一个?所以他们只是说 kotlin.collections.LinkedHashMap 只是 java.util.HashMap 的另一个名称。另一个例子是 Kotlin/Native:他们实施的 HashMap 似乎已经 linked,所以我们不需要全新的 class.

只要他们在这些不同平台上实现的东西满足“通用”声明的要求(即两个泛型类型参数KV,并实现MutableMap<K, V>) ,他们很好。