Scala尝试[单位]混乱

Min*_*hai 2 types scala try-catch

我有这段代码

import scala.util.Try
val t: Try[Unit] = Try(Try(1))
Run Code Online (Sandbox Code Playgroud)

和2个问题:

  • 这里发生了什么?该类型如何Try[Try[Int]]匹配 Try[Unit]?是不是因为斯卡拉选择块返回类型 Try(1)Unit以匹配所需的类型?
  • 反正有没有检测到嵌套Try?说我有Try[A],我怎么知道是否A是另一个Try[_]

pra*_*upd 7

您基本上是强制编译器指定TryUnit.

例如,下面的doSomething方法应该返回Int为最后一个语句,但返回类型Unit强制它返回().

scala> def doSomething: Unit = 1 + 1
doSomething: Unit
Run Code Online (Sandbox Code Playgroud)

在您的示例中val t: Try[Unit] = Try(Try(1 / 0)),您要求编译器将内部Try(1 / 0)视为Unit; 意思是

scala> val innerTry: Unit = Try(1 / 0)
innerTry: Unit = ()
Run Code Online (Sandbox Code Playgroud)

这意味着即使Try失败,它Unit总是SuccessTry你拥有的另一个.

scala> val t: Try[Unit] = Try(someOperation)
t: scala.util.Try[Unit] = Success(())
Run Code Online (Sandbox Code Playgroud)

最好删除您提供的特定类型,让编译器弄明白,

scala> val t = Try(Try(1 / 0))
t: scala.util.Try[scala.util.Try[Int]] = Success(Failure(java.lang.ArithmeticException: / by zero))
Run Code Online (Sandbox Code Playgroud)

另请阅读:Scala:为什么我可以将Int转换为Unit?

final abstract class Unit private extends AnyVal {
  // Provide a more specific return type for Scaladoc
  override def getClass(): Class[Unit] = ???
}
Run Code Online (Sandbox Code Playgroud)