scala – 在嵌套类型的伴随对象中查找隐式值
发布时间:2020-12-16 18:28:42 所属栏目:安全 来源:网络整理
导读:我有一个特征Outer与成员F是一个类型构造函数.我想为F提供类型类实例,但不知何故,scalac的隐式解析在某个时刻停止工作. 我尝试构建一个较小的最小示例,但我必须添加下面的所有内容才能显示错误.注意倒数第二行仍然是如何编译的,从sub中的嵌套伴随对象中正确
我有一个特征Outer与成员F是一个类型构造函数.我想为F提供类型类实例,但不知何故,scalac的隐式解析在某个时刻停止工作.
我尝试构建一个较小的最小示例,但我必须添加下面的所有内容才能显示错误.注意倒数第二行仍然是如何编译的,从sub中的嵌套伴随对象中正确地拾取隐含. 但是最后一行不再编译了.另请注意,在倒数第二行中指定隐式方法时,它会进行编译. 任何人都可以提供为什么会发生这种情况的线索? trait TC[F[_]] trait Outer[N[_]] { trait F[_] object F { implicit val tcInst: TC[F] = new TC[F]{} } } case class Sub[N[_]]() extends Outer[N] object Test{ implicit val optionInst: TC[Option] = new TC[Option]{} val sub = Sub[Option]() val sub2 = Sub[sub.F]() implicitly[TC[sub.F]] //compiles implicitly[TC[sub2.F]](sub2.F.tcInst) //compiles implicitly[TC[sub2.F]] //doesn't compile } 最后一行产生以下错误: Error:(22,13) could not find implicit value for parameter e: test.novariance.TC[test.novariance.Test.sub2.F] implicitly[TC[sub2.F]] //doesn't compile ^ Error:(22,13) not enough arguments for method implicitly: (implicit e: test.novariance.TC[test.novariance.Test.sub2.F])test.novariance.TC[test.novariance.Test.sub2.F]. Unspecified value parameter e. implicitly[TC[sub2.F]] //doesn't compile ^ 解决方法
我可以看出为什么你的隐含没有解决,所以我会试着解释它为什么不满足范围规则.
但我不清楚你的意图是什么,所以我不能建议一个解决方法. 一步步: >为了隐式地满足这个表达式[TC [sub2.F]],编译器将搜索词法(周围)范围,然后搜索TC和sub2.F.type类型的伴侣(如果有的话)(即对象F的类型)嵌套在外面). 如果你想在外面引用特征F,你需要类型投影运算符#,例如sub2 #F (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |