I'm using JavaConverters to go from a Java SortedSet to a Vector.
val lines = function.getInstructions.asScala.toVector
My getInstructions function returns an ArrayList of java.lang.Long, yet the consuming code requires Scala.Long. Is there a way to do this without changing all of my consuming code to use Java.lang.Long?
Furthermore, is there a way to do an implicit conversion to a value class to allow random access to the ArrayList without allocating an extra object as above? Thanks a ton for any insight you might provide.
Scala has autoboxing, so much of the time a
scala.Long
is ajava.lang.Long
. This is almost always the case when the value is stored inside a collection likeVector
. At present it is safe to do a.asInstanceOf[Vector[scala.Long]]
to convert the type of theVector
, but this could change in the future.A safer way is to explicitly convert the values. Scala has implicit conversions between
scala.Long
andjava.lang.Long
, but they won't convert collections of those types. However, you can combine them withmap
to convert, e.g..map(Long2long)
to convert a collection ofjava.lang.Long
to a collection ofscala.Long
.As for your second question, if you import
scala.collection.JavaConversions._
instead ofJavaConverters
you will get a set of implicit conversions. However, the recommended way is it to useJavaConverters
. It would also be more efficient in your case, because the wrapper only has to be created once.If you really like to play fast and dangerous, you could write your own implicit conversion: