Scala 无法识别隐式转换



>我正在尝试通过隐式转换在 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)
}

阿拉伯数字。使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)
  }
}

相关内容

  • 没有找到相关文章

最新更新