CollectionConverters 总是 return 原始源对象?

CollectionConverters always return the original source object?

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

中间的字母是否表示已复制?如果是这样,关于何时制作副本从而影响性能的确切规则是什么?

asJavaasScala 从不复制整个 collections,但它们会实例化包装器。

val orig = ListBuffer(1,2,3).asJava之后,orig是一个wrapper,class的一个实例scala.collection.convert.JavaCollectionWrappers$MutableBufferWrapper

下一个.asScala后,你得到原来的ListBuffer回来。

现在您再次调用 .asJava。在这一点上,除了要实例化一个新包装器之外没有其他可能的结果,而不是(正如您发现的那样)eq 到以前的包装器。

您引用的保证适用于原始 collections,不适用于转换包装。也许措辞应该更清楚。