首页 > 解决方案 > How does implicit conversions between scala-java collections work? How is it possible that it is sufficient to import some package?

问题描述

import scala.collection.JavaConversions._
val j: java.util.Map[String, String] = Map("a" -> "b")
print (j)

How does it work? In other words I am dying to know how import of some library (JavaConversions here) can help in making some conversions. After all, I didn't call any conversion function.
How does it work?

标签: scalaimplicit-conversionimplicitscala-java-interop

解决方案


您总是可以看到如何使用来解决隐式reify

import scala.jdk.CollectionConverters._
import scala.reflect.runtime.universe.reify

println(reify{
  Map("a" -> "b").asJava
}.tree)
//CollectionConverters.MapHasAsJava(Predef.Map.apply(Predef.ArrowAssoc("a").$minus$greater("b"))).asJava

scala.jdk.CollectionConverters._所以随着行的导入带来的隐含

val j: java.util.Map[String, String] = Map("a" -> "b").asJava

被转化为

val j: java.util.Map[String, String] =
  CollectionConverters.MapHasAsJava(Map("a" -> "b")).asJava

这种重写(隐式解析)发生在编译时使用静态类型,但方法.MapHasAsJava(..)总是.asJava在运行时使用动态调度调用。

同样,对于以前版本的 Scala

import scala.collection.JavaConversions._

println(reify{
  val j: java.util.Map[String, String] = Map("a" -> "b")
}.tree)
//val j: Map[Predef.String, Predef.String] = JavaConversions.mapAsJavaMap(Predef.Map.apply(Predef.ArrowAssoc("a").$minus$greater("b")));

意味着这条线

val j: java.util.Map[String, String] = Map("a" -> "b")

被转化为

val j: java.util.Map[String, String] =
  JavaConversions.mapAsJavaMap(Map("a" -> "b"))

推荐阅读