scala – 如何获取与上下文绑定关联的类型类的实例?
发布时间:2020-12-16 09:30:00 所属栏目:安全 来源:网络整理
导读:注意:我提出这个问题来回答这个问题,但是其他的答案是可以接受的。 考虑以下简单的方法: def add[T](x: T,y: T)(implicit num: Numeric[T]) = num.plus(x,y) 我可以使用context bound重写这个如下 def add[T: Numeric](x: T,y: T) = ??.plus(x,y) 但是如
注意:我提出这个问题来回答这个问题,但是其他的答案是可以接受的。
考虑以下简单的方法: def add[T](x: T,y: T)(implicit num: Numeric[T]) = num.plus(x,y) 我可以使用context bound重写这个如下 def add[T: Numeric](x: T,y: T) = ??.plus(x,y) 但是如何获取Numeric [T]类型的实例,以便我可以调用加号方法? 解决方法
使用隐式方法
最常见的一般方法是使用Predef中定义的implicitly method: def add[T: Numeric](x: T,y: T) = implicitly[Numeric[T]].plus(x,y) 显然,这有点冗长,需要重复类型类的名称。 参考证据参数(不要!) 另一个选择是使用由编译器自动生成的隐含证据参数的名称: def add[T: Numeric](x: T,y: T) = evidence$1.plus(x,y) 令人惊讶的是,这种技术甚至是合法的,在实践中不应该依赖这种技术,因为证据参数的名称可能会改变。 更高级的背景(介绍上下文方法) 相反,可以使用加密版本的隐式方法。注意,隐式方法被定义为 def implicitly[T](implicit e: T): T = e 该方法只需依赖于编译器将正确类型的隐式对象从周围范围插入到方法调用中,然后返回。我们可以做一点更好: def context[C[_],T](implicit e: C[T]) = e 这允许我们将我们的添加方法定义为 def add[T: Numeric](x: T,y: T) = context.plus(x,y) 上下文方法类型参数Numeric和T从范围推断!不幸的是,在这种情况下,这种上下文方法将不起作用。当类型参数具有多个上下文边界或者具有不同上下文边界的多个参数时。我们可以用稍微复杂的版本解决后一个问题: class Context[T] { def apply[C[_]]()(implicit e: C[T]) = e } def context[T] = new Context[T] 此版本要求我们每次都指定类型参数,但可以处理多个类型的参数。 def add[T: Numeric](x: T,y: T) = context[T]().plus(x,y) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |