gpt4 book ai didi

java - Scala 中的集合和 toArray

转载 作者:行者123 更新时间:2023-12-02 06:01:34 25 4
gpt4 key购买 nike

Java代码:

Collection<MethodInfo> items = getItems();
MethodInfo[] itemsArray = items.toArray(new MethodInfo[items.size()]);

我想知道 Scala 中的等效代码是什么?

val items: Seq[MethodInfo] = getItems
val itemsArray: Array[MethodInfo] = ???

最佳答案

正如 @SpiderPig 在他的评论中指出的,您可以简单地调用 items.toArray 将序列转换为数组。我认为您可能对 Java 中必须提供目标数组这一事实感到困惑,但在 Scala 中您只需调用不带参数的 toArray 即可。

您必须在 Java 中提供数组的原因与 type erasure 有关。 。 Java 编译器不知道在编译时要创建什么类型的数组,并且由于 Java 数组不是通用的,因此它们需要一个具体类型才能实例化。

toArray 的 Java 实现使用了一个技巧来绕过这个限制。通过传入所需类型的数组,JVM 可以使用该数组上的反射来实例化数组,以创建正确类型的新数组。 (您实际上可以将 0 元素数组传递给 toArray 方法,它将分配正确大小的数组。toArray 方法实际上将这项工作委托(delegate)给 Arrays.copyOf ,然后使用反射来创建副本。)

Scala 采用了不同的方法。 Scala 编译器比 Java 编译器在幕后做了更多的工作(默认参数、隐式转换、隐式参数等)。如果您查看implementation for toArray,您就会知道有一些编译器魔法在起作用。 :

def toArray[B >: A : ClassTag]: Array[B] = {
if (isTraversableAgain) {
val result = new Array[B](size)
copyToArray(result, 0)
result
}
else toBuffer.toArray
}

泛型类型中的ClassTag要求编译器提供类信息。这允许 JVM 为最终结果实例化正确类型和大小的数组。这意味着您不必提供数组,因为 Scala 库可以为您创建正确的类型和大小之一。

关于java - Scala 中的集合和 toArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19149904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com