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 中提供数组的原因与类型擦除 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html。 Java 编译器不知道在编译时要创建什么类型的数组,并且由于 Java 数组不是通用的,因此它们需要一个具体类型才能实例化。
Java 实现toArray
使用一个技巧来绕过这个限制。通过传入所需类型的数组,JVM 可以使用反射thatarray 实例化数组以创建正确类型的新数组。 (实际上,您可以将 0 元素数组传递给toArray
方法,它将分配一个正确大小的数组。这toArray
方法实际上将这项工作委托给Arrays.copyOf http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Arrays.java#2244,然后使用反射来创建副本。)
Scala 采用了不同的方法。 Scala 编译器比 Java 编译器在幕后做了更多的工作(默认参数、隐式转换、隐式参数等)。如果您查看以下内容,您就会知道有一些编译器魔法在起作用实施toArray https://github.com/scala/scala/blob/v2.10.2/src/library/scala/collection/TraversableOnce.scala#L246:
def toArray[B >: A : ClassTag]: Array[B] = {
if (isTraversableAgain) {
val result = new Array[B](size)
copyToArray(result, 0)
result
}
else toBuffer.toArray
}
The ClassTag
泛型类型中要求编译器提供类信息。这允许 JVM 为最终结果实例化正确类型和大小的数组。这意味着您不必提供数组,因为 Scala 库可以为您创建正确的类型和大小之一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)