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
中间的字母是否表示已复制?如果是这样,关于何时制作副本从而影响性能的确切规则是什么?
asJava
和 asScala
从不复制整个 collections,但它们会实例化包装器。
在val orig = ListBuffer(1,2,3).asJava
之后,orig
是一个wrapper,class的一个实例scala.collection.convert.JavaCollectionWrappers$MutableBufferWrapper
。
下一个.asScala
后,你得到原来的ListBuffer
回来。
现在您再次调用 .asJava
。在这一点上,除了要实例化一个新包装器之外没有其他可能的结果,而不是(正如您发现的那样)eq
到以前的包装器。
您引用的保证适用于原始 collections,不适用于转换包装。也许措辞应该更清楚。
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
从不复制整个 collections,但它们会实例化包装器。
在val orig = ListBuffer(1,2,3).asJava
之后,orig
是一个wrapper,class的一个实例scala.collection.convert.JavaCollectionWrappers$MutableBufferWrapper
。
下一个.asScala
后,你得到原来的ListBuffer
回来。
现在您再次调用 .asJava
。在这一点上,除了要实例化一个新包装器之外没有其他可能的结果,而不是(正如您发现的那样)eq
到以前的包装器。
您引用的保证适用于原始 collections,不适用于转换包装。也许措辞应该更清楚。