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类,不能是HashMapTreeMap等子类型,否则会报错。
同样道理,java类向scala类转换时也只能转换到scala.collection.mutable.Map,也可以转到父类scala.collection.Map,但不可以转到scala.collection.SortedMapscala.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类继承图:
在这里插入图片描述

posted @ 2018-12-29 09:00  xuejianbest  阅读(1090)  评论(0编辑  收藏  举报