加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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的类型)嵌套在外面).
>在词法范围内,只有TC [Option],它与sub2.F.type的类型不同.
>在伴随作用域中,TC没有伴随对象. sub2.F不是一个类,它是一个对象,所以它不能有一个伴随对象.

如果你想在外面引用特征F,你需要类型投影运算符#,例如sub2 #F

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读