【问题标题】:Scala: implicitly to implicit classScala:隐式到隐式类
【发布时间】:2016-11-21 22:38:03
【问题描述】:

给定:

implicit class Foo(val i: Int) {
   def addValue(v: Int): Int = i + v
}

是否有可能适用于任何implicitly? 我在这里遇到错误:

<console>:14: error: could not find implicit value for parameter e: Foo
       implicitly[Foo]

【问题讨论】:

  • implicitly[Foo](4) 将返回 res0: Foo = Foo@5d5eef3d
  • 那和val foo: Foo = 4编译的原因是一样的。

标签: scala implicit-conversion implicit


【解决方案1】:

implicit class Foo(val i: Int) 表示存在从IntFoo隐式转换。所以implicitly[Int =&gt; Foo] 应该可以工作。

这样想:如果你可以用implicitly[Foo]召唤一个Foo,你希望得到哪个FooFoo(0)? Foo(1)? Foo(2)?

【讨论】:

    【解决方案2】:

    欲知详情,

    implcitly关键字可以解释如下

    implitly[T] 表示在上下文中返回类型 T 的隐含值

    这意味着,要隐式获取Foo,您需要在范围内创建一个隐式值

    例如,

     implicit class Foo(val i: Int) {
       def addValue(v: Int): Int = i + v
     } 
    
     implicit val foo:Foo = Foo(1)
     val fooImplicitly = implicitly[Foo] // Foo(1)
    

    另外,注意Foo本身只是一个类,

    但是通过在类定义前面加上隐含的关键字,

    编译器创建Int =&gt; Foo类型的隐式函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多