scala:scala和java的类型隐式转换
scala提供了scala.collection.JavaConversions
类,这个类的作用是提供一些Scala类型和Java类型之间的转换,只要引入此类中相应的隐式转化方法,在程序中就可以用相应的对应类型来代替要求的类型。如
引入
import scala.collection.JavaConversions.bufferAsJavaList
ArrayBuffer -> List
在要使用java.util.List
类型的地方,就可以用scala.collection.mutable.ArrayBuffer
类型,类型转换将自动进行:ArrayBuffer
被包装成了一个实现了List
接口的对象。
同样
import scala.collection.JavaConversions.asScalaBuffer
java.util.List -> scala.collection.mutable.Buffer
import scala.collection.JavaConversions.mapAsScalaMap
java.util.Map及其子类 -> scala.collection.mutable.Map
import scala.collection.JavaConversions.mapAsJavaMap
scala.collection.Map及其子类 -> java.util.Map
import scala.collection.JavaConversions.propertiesAsScalaMap
java.util.Properties -> scala.collection.mutable.Map
有个注意事项:
由scala Map向java Map的转换需要引入mapAsJavaMap
,而且这种转换只能转换为java.util.Map
类,不能是HashMap
、TreeMap
等子类型,否则会报错。
同样道理,java类向scala类转换时也只能转换到scala.collection.mutable.Map
,也可以转到父类scala.collection.Map
,但不可以转到scala.collection.SortedMap
或scala.collection.immutable.Map
总结:
若A可转换为B,则A和A的子类都可转化为B和B的父类,反之则不行。
此转换类支持的转换:
scala.collection.Iterable <=> java.lang.Iterable
scala.collection.Iterable <=> java.util.Collection
scala.collection.Iterator <=> java.util.{ Iterator, Enumeration }
scala.collection.mutable.Buffer <=> java.util.List
scala.collection.mutable.Set <=> java.util.Set
scala.collection.mutable.Map <=> java.util.{ Map, Dictionary }
scala.collection.mutable.ConcurrentMap (2.10后不推荐) <=> java.util.concurrent.ConcurrentMap
scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap
还支持:
scala.collection.Seq => java.util.List
scala.collection.mutable.Seq => java.util.List
scala.collection.Set => java.util.Set
scala.collection.Map => java.util.Map
java.util.Properties => scala.collection.mutable.Map[String, String]
如果一个类转化为另一个类后还能转化回来,则转回来的类还是原来的类:
import scala.collection.JavaConversions._
val sl = new scala.collection.mutable.ListBuffer[Int]
val jl : java.util.List[Int] = sl
val s2 : scala.collection.mutable.Buffer[Int] = jl
assert(sl eq s2)
附scala Map类继承图: