scala – 使用泛型隐式参数进行隐式转换
发布时间:2020-12-16 18:48:21 所属栏目:安全 来源:网络整理
导读:我似乎将隐式转换与通用隐式参数结合起来不起作用,如下面的示例2b所示: object Test { case class Foo(i: Int) case class Bar(i: Int) case class Zip(i: Int) object Foo { // 1) implicit def toBar(foo: Foo)(implicit g: Int = Bar): Bar = g(foo.i) /
我似乎将隐式转换与通用隐式参数结合起来不起作用,如下面的示例2b所示:
object Test { case class Foo(i: Int) case class Bar(i: Int) case class Zip(i: Int) object Foo { // 1) implicit def toBar(foo: Foo)(implicit g: Int => Bar): Bar = g(foo.i) // 2) implicit def toT[T](foo: Foo)(implicit g: Int => T): T = g(foo.i) } // 1) implicit val b = (i: Int) => Bar(i) val bar: Bar = Foo(3) // 2a) implicit val z = (i: Int) => Zip(i) val zip: Zip = Foo.toT(Foo(3)) // 2b) val zip2: Zip = Foo(3) // <- compiler error,implicit conversion not applied } 有没有理论上的理由说明为什么这不起作用,或者它是否是实施的限制? 解决方法
对于它的价值,如果您运行以下简化版本的代码
case class Foo(i: Int) case class Zip(i: Int) implicit def toT[T](foo: Foo)(implicit g: Int => T): T = g(foo.i) implicit val z = (i: Int) => Zip(i) val zip2: Zip = Foo(3) // <- compiler error,implicit conversion not applied 使用-Yinfer-debug,你会得到lots of debug information(Scala 2.9.2)关于幕后发生的事情.我不熟悉Scala编译器内部,但以下两个输出片段可能暗示了这个问题.第一个是(要点的第51ff行) [inferImplicit view] pt = this.Foo => this.Zip Implicit search in Context(Main.$anon.zip2@ValDef scope=1100551785) { search this.Foo => this.Zip target $anon.this.Foo.apply(3) isView true eligible toT: [T](foo: this.Foo)(implicit g: Int => T)T } 我把它解释为“我们正在寻找一个隐含的this.Foo => this.Zip和一个值得关注的候选人是T:[T](foo:this.Foo)(隐式g:Int => T) T. inferMethodInstance,still undetermined: List(type T) 我的解释是,Scala以某种方式无法用Zip实例化T,这就是候选人最终被丢弃的原因. 也就是说,我没有看到你的代码存在理论上的问题,我认为这只是编译器的一个缺点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |