各种JavaConverters
类都使用适配器模式来包装原始 Java 集合(underlying
)并提供 Scala 接口。因此,转换和访问转换后的集合在时间上都是恒定的(O(1)
),只引入了很小的开销。
例如,这是完整的源代码JListWrapper
:
case class JListWrapper[A](val underlying : java.util.List[A]) extends mutable.Buffer[A] {
def length = underlying.size
override def isEmpty = underlying.isEmpty
override def iterator : Iterator[A] = underlying.iterator
def apply(i : Int) = underlying.get(i)
def update(i : Int, elem : A) = underlying.set(i, elem)
def +=:(elem : A) = { underlying.subList(0, 0).add(elem) ; this }
def +=(elem : A): this.type = { underlying.add(elem); this }
def insertAll(i : Int, elems : Traversable[A]) = { val ins = underlying.subList(0, i) ; elems.seq.foreach(ins.add(_)) }
def remove(i : Int) = underlying.remove(i)
def clear = underlying.clear
def result = this
}
另请注意,将 Java 集合转换为 Scala 然后再转换回 Java 会产生原始集合,而不是双重包装器。