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