CollectionConverters总是返回原始源对象?

问题描述 投票:2回答:1

[CollectionConverts API状态

在所有情况下,从源类型转换为目标类型然后返回再次将返回原始源对象。

这似乎并不总是正确的。例如,在以下情况下,确实是CollectionConverts

true

但是val orig = ListBuffer(1,2,3) assert(orig.asJava.asScala eq orig) // OK 断言失败

here

断言通过[更改为val orig = ListBuffer(1,2,3).asJava assert(orig.asScala.asJava eq orig) // Boom! 而不是List

ListBuffer

中例是否表示已复制?如果是这样,那么何时复制副本的确切规则是什么?

scala performance wrapper scala-collections scala-java-interop
1个回答
4
投票

[val orig = List(1,2,3).asJava assert(orig.asScala.asJava eq orig) // OK asJava从不复制整个集合,但是它们确实实例化包装器。

asScala之后,val orig = ListBuffer(1,2,3).asJava是包装器,是类orig的实例。

在下一个scala.collection.convert.JavaCollectionWrappers$MutableBufferWrapper之后,您将获得原始的.asScala

现在您再次呼叫ListBuffer。在这一点上,除了实例化一个新的包装程序外,没有其他可能的结果,而不是(如您所发现的).asJava到先前的包装程序。

您引用的保证适用于原始集合,而不适用于转换包装。也许措词应该对此更清楚。

© www.soinside.com 2019 - 2024. All rights reserved.