Scala 不识别隐式转换

Scala doesn't recognize implicit conversion

我正在尝试通过隐式转换在 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。 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 class 隐含。隐式 class 类似于隐式方法 - 给定一些 t: Try[A],它将构造一个 TryOps[A] 类型的(隐式)值。隐式 class 的新增功能是它可以定义新创建的隐式对象(在您的情况下 getOrThrow() )上可用的方法。请注意,隐式 class 在构造函数中必须只有一个参数,这是有道理的。另请注意,隐式 class 不能单独存在,因此您应该将其移至特征或对象(将其移至对象 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)
  }
}