Scala 2.12中的隐式ExecutionContext优先级
发布时间:2020-12-16 18:49:29 所属栏目:安全 来源:网络整理
导读:在 Scala 2.12中导入全局执行上下文然后在作用域中定义了另一个隐式执行上下文导致模糊隐式,而在2.11中它可以正常工作. import scala.concurrent._import scala.concurrent.ExecutionContext.Implicits.globalclass A(implicit ec: ExecutionContext) { x =
在
Scala 2.12中导入全局执行上下文然后在作用域中定义了另一个隐式执行上下文导致模糊隐式,而在2.11中它可以正常工作.
import scala.concurrent._ import scala.concurrent.ExecutionContext.Implicits.global class A(implicit ec: ExecutionContext) { x = implicitly[ExecutionContext] } 编译器给出错误: error: ambiguous implicit values: both lazy value global in object Implicits of type => scala.concurrent.ExecutionContext and value ec in class A of type scala.concurrent.ExecutionContext match expected type scala.concurrent.ExecutionContext val x = implicitly[ExecutionContext] ^ 这是什么原因以及如何在代码中解决它? 解决方法
规范将重载决策视为选择类成员的消歧.但隐式解析使用静态重载决策来选择不是成员的引用.
可以说,以下是对规范的误解,因为zzz是在一个派生自X的类中定义的,因为yyy是: $scala Welcome to Scala 2.12.0 (Java HotSpot(TM) 64-Bit Server VM,Java 1.8.0_101). Type in expressions for evaluation. Or try :help. scala> import concurrent._,ExecutionContext.global import concurrent._ import ExecutionContext.global scala> trait X { implicit val xxx: ExecutionContext = global } defined trait X scala> class Y extends X { implicit val yyy: ExecutionContext = global ; def f = implicitly[ExecutionContext] } defined class Y scala> class Z extends X { def f(implicit zzz: ExecutionContext) = implicitly[ExecutionContext] } <console>:16: error: ambiguous implicit values: both value xxx in trait X of type => scala.concurrent.ExecutionContext and value zzz of type scala.concurrent.ExecutionContext match expected type scala.concurrent.ExecutionContext class Z extends X { def f(implicit zzz: ExecutionContext) = implicitly[ExecutionContext] } ^ 目前,您必须依赖命名来隐藏隐藏的封闭范围: scala> class Z extends X { def f(implicit xxx: ExecutionContext) = implicitly[ExecutionContext] } defined class Z 要么, scala> :pa // Entering paste mode (ctrl-D to finish) package object p { import concurrent._ ; implicit val xxx: ExecutionContext = ExecutionContext.global } package p { import concurrent._ ; class P { def f(implicit xxx: ExecutionContext) = implicitly[ExecutionContext] def g = implicitly[ExecutionContext] } } // Exiting paste mode,now interpreting. scala> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |