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

传递scala.math.Integral作为隐式参数

发布时间:2020-12-16 09:15:33 所属栏目:安全 来源:网络整理
导读:我已经阅读了关于 scala.math.Integral的 question的答案,但是我不明白当Integral [T]作为一个隐式参数传递时会发生什么. (我认为我一般理解隐含参数概念). 让我们考虑一下这个功能 import scala.math._def foo[T](t: T)(implicit integral: Integral[T]) {p
我已经阅读了关于 scala.math.Integral的 question的答案,但是我不明白当Integral [T]作为一个隐式参数传递时会发生什么. (我认为我一般理解隐含参数概念).

让我们考虑一下这个功能

import scala.math._
def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)}

现在我在REPL中调用foo:

scala> foo(0)  
scala.math.Numeric$IntIsIntegral$@581ea2
scala> foo(0L)
scala.math.Numeric$LongIsIntegral$@17fe89

积分参数如何变成scala.math.Numeric $IntIsIntegral和scala.math.Numeric $LongIsIntegral?

解决方法

该参数是隐式的,这意味着Scala编译器将会看到它是否可以在某个地方找到一个可以自动填入该参数的地方.

当你传入一个Int,它将会寻找一个隐含的对象,它是一个Integral [Int],它在scala.math.Numeric中找到它.您可以查看scala.math.Numeric的源代码,您可以在其中找到:

object Numeric {
  // ...

  trait IntIsIntegral extends Integral[Int] {
    // ...
  }

  // This is the implicit object that the compiler finds
  implicit object IntIsIntegral extends IntIsIntegral with Ordering.IntOrdering
}

同样,Long也有一个不同的隐含对象,它以相同的方式工作.

(编辑:李大同)

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

    推荐文章
      热点阅读