【问题标题】:CollectionConverters always return the original source object?CollectionConverters 总是返回原始源对象?
【发布时间】:2020-05-30 18:46:01
【问题描述】:

CollectionConverters API 状态

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

这似乎并不总是正确的。比如下面这种情况确实是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

中间大写是否意味着复制?如果是这样,关于何时制作副本从而影响性能的确切规则是什么?

【问题讨论】:

    标签: scala performance wrapper scala-collections scala-java-interop


    【解决方案1】:

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

    val orig = ListBuffer(1,2,3).asJava之后,orig是一个包装器,是scala.collection.convert.JavaCollectionWrappers$MutableBufferWrapper类的一个实例。

    在下一个.asScala 之后,你会得到原来的ListBuffer

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

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

    【讨论】:

    • 有趣的是,changing 前一种情况是 List 而不是 ListBuffer 传递了断言,所以看起来我们甚至得到了原来的包装器。
    • 这让我感到困惑,List 会有所不同。我会调查并报告。 (我可能要到周二才能开始。)
    • 啊,CollectionConverters 文档声明某些转换是单向的。 scala.collection.immutable.List 仅被单向转换覆盖。同样,在我看来,您引用的句子(“在所有情况下......”)可以改进,以更清楚地了解它适用于哪些情况。我们不能期望它适用于单向转换。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多