CollectionConverters
API状态
In all cases, converting from a source type to a target type and back again will return the original source object.
这似乎并不总是正确的。例如,在下面的情况下,它确实是 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
断言通过
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
。此时,除了实例化新包装器而不是(正如您所发现的)eq
到先前的包装器之外,没有其他可能的结果。
您引用的保证适用于原始集合,而不适用于转换包装器。也许措辞应该更清楚。
关于scala - CollectionConverters 总是返回原始源对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60235285/