gpt4 book ai didi

scala - 如何使这个 Scala 隐式转换工作?

转载 作者:行者123 更新时间:2023-12-01 23:25:21 25 4
gpt4 key购买 nike

我正在使用一个库,该库提供以下内容(关系可以隐式转换为节点):

class Relation[A,B]
class Node[A,B](r: Relation[A,B])
implicit def relation2node[A,B](r: Relation[A,B]) = new Node(r)

我正在扩展 Relation 供我自己使用:

class XRelation[A] extends Relation[A,Int]

Relations/XRelations 应该被子类化:

class User extends XRelation[Int]

现在,我还定义了我自己的 Helper 方法,例如 GET,旨在与任何 Node 和任何转换为​​ Node 的东西一起工作:

class Helper[A,B](n: Node[A,B]) { def GET {} }

// note: this is the only way I know of to make the next example work.
implicit def xx2node2helper[A,B,C[_,_]](x: C[A,B])(implicit f: C[A,B] => Node[A,B]) = new Helper(x)

所以这个例子有效:

new Relation[Int,Int]().GET

如果我添加另一个隐式转换:

// don't understand why this doesn't work for the previous example
// but works for the next example
implicit def x2node2helper[A,B,C](x: C)(implicit f: C => Node[A,B]) = new Helper(x)

我还可以进行以下转换:

new XRelation[Int]().GET

但这行不通:

new User().GET

遗憾的是,失败了:

error: No implicit view available from Sandbox3.User => Sandbox3.Node[A,B]

谁能理解这一切并解释如何让最后一个例子起作用?提前致谢。

更新:我知道您可以从 Relation 中引入隐式转换,但我要求 (1) 弄清楚如何在不必引入隐式的情况下执行此操作来自可能隐式转换为 Node 的每一种类型,以及 (2) 以巩固我对隐式的理解。

最佳答案

implicit def nodeLike2Helper[R, C <: R](r:C)(implicit f: R => Node[_,_]) = {
new Helper(r)
}

正如错误信息所示,User没有隐式转换为 Node .但是它的超父类(super class)Relation了。因此,您只需为类型参数指定正确的界限即可。

仅供引用,有一个语法糖 <%对于 View 边界,所以上面的代码可以更短:

implicit def nodeLike2Helper[R <% Node[_,_], C <: R](r:C) = {
new Helper(r)
}

关于scala - 如何使这个 Scala 隐式转换工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8440122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com