如何在特征中使用隐式方法

时间:2018-10-02 15:42:08

标签: scala

我试图了解Scala中的隐式方法,在SlashSyntax.scala中,我定义了一个自定义运算符方法:

package com.example.hello.impl

object SlashSyntax {

  final class IntOps(private val intSrc: Int) {
    def \(a2: Int): Int = (intSrc.toString + a2.toString).toInt
  }

}

trait SlashSyntax {

  import SlashSyntax._

  implicit def intOps(src: Int) = new IntOps(src)
}

然后在主要方法中,我尝试使用运算符,但提示无法解析符号:

object Test {
  def main(args: Array[String]): Unit = {
    import com.example.hello.impl.SlashSyntax._
    val s = 10 \ 2  //cannot resolve symbol \
  }
}

如何使用自己的运算符?

3 个答案:

答案 0 :(得分:2)

最简单的解决方案是将IntOps类设为implicit class。然后

  1. 您不需要SlashSyntax特质(也可以将其用于其他用途)
  2. 隐式对象在正确的位置导入
  3. 讨厌的implicit conversion method ...警告消失

答案 1 :(得分:1)

错误导入导致的问题。

import com.example.hello.impl.SlashSyntax._

这里的问题是您从object SlashSyntax而不是trait SlashSyntax导入了所有成员。发生这种情况是因为Scala将com.example.hello.impl.SlashSyntax视为path。所有路径只能由Stable members组成。特性不是Stable members,而是objects是稳定成员,因此scala是从object SlashSyntax导入的成员。

您只需将隐式方法移至object SlashSyntax,即可解决此问题。

答案 2 :(得分:0)

  1. 您的对象SlashSyntax不扩展特征SlashSyntax,因此在执行SlashSyntax._时看不到扩展方法。

  2. 此外,您没有执行import scala.languageFeatures.implicitConversions。尽管您可能已将-language:implicitConversions标志添加到了scalac。

  3. 有时缺少类型注释会破坏事物。不在您的情况下,但那里的这些东西通常很不错。

这有效:

object SlashSyntax extends SlashSyntax {

  final class IntOps(private val intSrc: Int) {
    def \(a2: Int): Int = (intSrc.toString + a2.toString).toInt
  }

}

trait SlashSyntax {

  import SlashSyntax.IntOps

  implicit def intOps(src: Int): IntOps = new IntOps(src)
}