如何正确导入Kotlin的ArrayList版本而不是Java的?

pdtvr36n  于 2023-01-17  发布在  Kotlin
关注(0)|答案(3)|浏览(177)

我刚开始学习Kotlin,每当我尝试导入一个ArrayList时,如下所示:

fun someFunction(){
      var list = ArrayList<String>()
  }

它将我引导到这个类(如果我按ctrl + click),在我看来它是某种到Java版本的ArrayList的链接:

@file:Suppress("ACTUAL_WITHOUT_EXPECT") // for building kotlin-stdlib-jvm-minimal-for-test

package kotlin.collections

@SinceKotlin("1.1") public actual typealias RandomAccess = java.util.RandomAccess

@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
@SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@SinceKotlin("1.1") public actual typealias HashMap<K, V> = java.util.HashMap<K, V>
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@SinceKotlin("1.1") public actual typealias HashSet<E> = java.util.HashSet<E>

我理解得对吗?还是我搞错了?typealias意味着每当我输入ArrayList时,它实际上链接到java.util.ArrayList,不是吗?
先谢了。

e5nszbig

e5nszbig1#

当目标是JVM平台时,Kotlin使用Java版本的ArrayList(以及许多其他集合类),但这并不意味着您只能使用Java提供的工具,相反,Kotlin为其集合提供了许多有用的扩展函数,无论它们是否是类型别名。
例如,可以使用indices

for (i in myList.indices)
    println("$i: $myList[i]")

你甚至可以解构它:

val myList = arrayListOf(16, 1, 2023)
val (d, m, y) = myList

因此,您应该看到kotlin.collections.ArrayListjava.util.ArrayList的类型别名这一事实,这仅仅是内部实现细节。
有关功能的完整列表,请参见https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-list/
另外,如果你ctrl+click进入ArrayList,IntelliJ有时在显示一个类型别名类的确切定义方面不是很有用。但是,如果你在调试器下运行,在构造ArrayList的行上放一个断点,然后“单步执行”,你就会在运行时看到确切的实现。

1sbrub3j

1sbrub3j2#

如果您转到Kotlin documentation for ArrayList,您可以看到不同Kotlin平台的各种类型定义-一个用于 Common(一个类),一个用于 JavaScript(另一个类),一个用于 JVM(Java,您正在使用的是Java):

// JVM
typealias ArrayList<E> = ArrayList<E>

如果将鼠标悬停在等号后面的ArrayList上,您会看到它实际上使用的是java.util.ArrayList类,因为它是typealias,这意味着JVM上Kotlin的ArrayList**只是java.util.ArrayList类的另一个名称。
你也可以点击类型定义下面的 source,它会把你带到源代码(这是你用 ctrl+click 到达的):

@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>

因此,您可以看到,在JVM上,Kotlin的ArrayList实际上只是Java类的别名(如果您想确切了解Kotlin中的类或函数在做什么,这样查看源代码总是很有用的!)
但是如果你查看 CommonJS 实现的源代码,你会发现它们的实现方式不同,所以你最终实际使用的是什么取决于你的Kotlin代码是在哪个平台上编译的。

jv4diomz

jv4diomz3#

typealias为现有类型提供替代名称,type aliases不引入新类型。它们等效于相应的基础类型
实际上,ArrayList只有一个版本,即java.util.ArrayList

相关问题