Неявное преобразование между Scala.Long и Java.lang.Long в коллекциях
Я использую JavaConverters для перехода от Java SortedSet к вектору.
val lines = function.getInstructions.asScala.toVector
Моя функция getInstructions возвращает ArrayList из java.lang.Long, но для потребляющего кода требуется Scala.Long. Есть ли способ сделать это, не меняя весь мой потребляющий код для использования Java.lang.Long?
Кроме того, есть ли способ сделать неявное преобразование в класс значений, чтобы обеспечить произвольный доступ к ArrayList без выделения дополнительного объекта, как описано выше? Большое спасибо за любую информацию, которую вы можете предоставить.
1 ответ
Scala имеет автобокс, поэтому большую часть времени scala.Long
это java.lang.Long
, Это почти всегда тот случай, когда значение хранится внутри коллекции, как Vector
, В настоящее время это безопасно сделать .asInstanceOf[Vector[scala.Long]]
преобразовать тип Vector
, но это может измениться в будущем.
Более безопасный способ - явное преобразование значений. Scala имеет неявные преобразования между scala.Long
а также java.lang.Long
, но они не будут конвертировать коллекции этих типов. Тем не менее, вы можете объединить их с map
конвертировать, например .map(Long2long)
преобразовать коллекцию java.lang.Long
в коллекцию scala.Long
,
Что касается вашего второго вопроса, если вы импортируете scala.collection.JavaConversions._
вместо JavaConverters
вы получите набор неявных преобразований. Тем не менее, рекомендуемый способ это использовать JavaConverters
, Это также будет более эффективным в вашем случае, потому что обертка должна быть создана только один раз.
Если вам действительно нравится играть быстро и опасно, вы можете написать собственное неявное преобразование:
implicit def convArrayList(al: ArrayList[java.lang.Long]): Vector[Long] =
al.asScala.map(Long2long)(collection.breakOut)