Scala无法识别隐式转换

时间:2017-03-19 09:45:51

标签: scala functional-programming implicit-conversion typeclass implicit

我正在尝试通过隐式转换在Scala的Try上定义一个额外的方法。这是我孤立的,可重复的例子 -

import scala.util.Try

object App {
  def main(args: Array[String]): Unit = {
    val t = Try(2)
    t.getOrThrow()
  }
}

trait TrySyntax {
  implicit final def trySyntax[A](t: Try[A]): TryOps[A] = new TryOps(t)
}

final class TryOps[A](val t: Try[A]) extends AnyVal {
  def getOrThrow(): A = t.getOrElse(throw t.failed.get)
}

我遇到了以下编译错误。

error: value getOrThrow is not a member of scala.util.Try[Int]
    t.getOrThrow(

有谁知道我做错了什么?显式转换 -  trySyntax(t).getOrThrow工作正常。我已经尝试导入scala.languageFeatures.implicitConversions但没有帮助。我最初也在自己的包中进行了隐式转换,导入为import mypackage._但产生了相同的结果。

1 个答案:

答案 0 :(得分:4)

你非常接近,有两种方法可以解决这个问题。

1。 您的应用TrySyntax方法无法使用main特征中包含的隐式转化。你需要导入它。这需要TrySyntax特征成为对象。

import scala.util.Try

object App {
  def main(args: Array[String]): Unit = {
    import TrySyntax._
    val t = Try(2)
    t.getOrThrow()
  }
}

object TrySyntax {
  implicit final def trySyntax[A](t: Try[A]): TryOps[A] = new TryOps(t)
}

final class TryOps[A](val t: Try[A]) extends AnyVal {
  def getOrThrow(): A = t.getOrElse(throw t.failed.get)
}

2。 使TryOps类隐式。隐式类与隐式方法类似 - 给定一些t: Try[A],它将构造类型为TryOps[A]的(隐式)值。隐式类的附加功能是它可以定义新创建的隐式对象(在您的情况下为getOrThrow())中可用的方法。请注意,隐式类在构造函数中必须只有一个参数,这是有意义的。另请注意,隐式类不能单独存在,因此您应将其移动到特征或对象(将其移动到对象App对您的示例最有意义)。

object App {
  def main(args: Array[String]): Unit = {
    val t = Try(2)
    t.getOrThrow()
  }

  final implicit class TryOps[A](val t: Try[A]) extends AnyVal {
    def getOrThrow(): A = t.getOrElse(throw t.failed.get)
  }
}