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