CollectionConverters всегда возвращают исходный объект-источник? - PullRequest
2 голосов
/ 15 февраля 2020

CollectionConverters Состояния API

Во всех случаях преобразование исходного типа в целевой тип и обратно возвращает исходный исходный объект.

Это не всегда так. Например, в следующем случае это действительно true

val orig = ListBuffer(1,2,3)
assert(orig.asJava.asScala eq orig)   // OK

однако здесь утверждение не выполнено

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

Означает ли средний регистр копию? Если да, то каковы точные правила, когда делается копия и, следовательно, происходит снижение производительности?

1 Ответ

4 голосов
/ 15 февраля 2020

asJava и asScala никогда не копируют целые коллекции, но они создают экземпляры упаковщиков.

После val orig = ListBuffer(1,2,3).asJava, orig является оболочкой, экземпляром класса scala.collection.convert.JavaCollectionWrappers$MutableBufferWrapper.

После следующего .asScala вы получите исходный ListBuffer обратно.

Теперь вы снова наберете .asJava. На данный момент нет другого возможного результата, кроме как для создания новой оболочки, а не (как вы обнаружили) eq к предыдущей оболочке.

Гарантия, которую вы цитируете, распространяется на оригинальные коллекции, а не на конверсионным оберткам. Возможно, формулировка должна быть яснее об этом.

...