我刚开始学习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,不是吗?
先谢了。
3条答案
按热度按时间e5nszbig1#
当目标是JVM平台时,Kotlin使用Java版本的
ArrayList
(以及许多其他集合类),但这并不意味着您只能使用Java提供的工具,相反,Kotlin为其集合提供了许多有用的扩展函数,无论它们是否是类型别名。例如,可以使用
indices
:你甚至可以解构它:
因此,您应该看到
kotlin.collections.ArrayList
是java.util.ArrayList
的类型别名这一事实,这仅仅是内部实现细节。有关功能的完整列表,请参见https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-list/
另外,如果你ctrl+click进入ArrayList,IntelliJ有时在显示一个类型别名类的确切定义方面不是很有用。但是,如果你在调试器下运行,在构造ArrayList的行上放一个断点,然后“单步执行”,你就会在运行时看到确切的实现。
1sbrub3j2#
如果您转到Kotlin documentation for
ArrayList
,您可以看到不同Kotlin平台的各种类型定义-一个用于 Common(一个类),一个用于 JavaScript(另一个类),一个用于 JVM(Java,您正在使用的是Java):如果将鼠标悬停在等号后面的
ArrayList
上,您会看到它实际上使用的是java.util.ArrayList
类,因为它是typealias
,这意味着JVM上Kotlin的ArrayList
**只是java.util.ArrayList
类的另一个名称。你也可以点击类型定义下面的 source,它会把你带到源代码(这是你用 ctrl+click 到达的):
因此,您可以看到,在JVM上,Kotlin的
ArrayList
实际上只是Java类的别名(如果您想确切了解Kotlin中的类或函数在做什么,这样查看源代码总是很有用的!)但是如果你查看 Common 和 JS 实现的源代码,你会发现它们的实现方式不同,所以你最终实际使用的是什么取决于你的Kotlin代码是在哪个平台上编译的。
jv4diomz3#
typealias
为现有类型提供替代名称,type aliases不引入新类型。它们等效于相应的基础类型实际上,
ArrayList
只有一个版本,即java.util.ArrayList