我正在尝试通过隐式转换在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._
但产生了相同的结果。
答案 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)
}
}