scala - 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?
解决方案
您总是可以看到如何使用来解决隐式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"))
推荐阅读
- php - Laravel 在 null 错误上调用成员函数 getName()
- angular - 覆盖 Angular 预定义的日期格式
- jenkins - 使用 Jenkins 脚本 (Groovy),我们可以为所有现有的 FreeStyle 项目自动化“添加构建步骤”吗?
- javascript - 是否存在与 CryptoJS 中 Jasypt-Library 的 AES256TextEncryptor 类等效的行为?
- c# - 自动化 SSRS 配置 C#
- tcp - Grafana:自己的控制面板
- postgresql - 在 Postgresql 中快速加入最近邻?
- javascript - interactjs 将 dragevent 传递给降低 zIndex
- azure - Azure Synapse、Azure SQL 数据库、Azure 托管实例和本地 SQL Server 中的跨数据库查询
- mongodb - 尝试为 mongodb 编写 liquibase 迁移更改日志