Scala 为什么可以将Try[Try[Unit]]值指定给Try[Unit]?

Scala 为什么可以将Try[Try[Unit]]值指定给Try[Unit]?,scala,error-handling,Scala,Error Handling,我刚刚遇到了一个非常奇怪的行为。代码如下: // So far everything's fine val x: Try[Try[Unit]] = Try(Try{}) x: scala.util.Try[scala.util.Try[Unit]] = Success(Success(())) // Compilation error should happen here val x: Try[Unit] = Try(Try{}) // Wuut ? x: scala.util.Try[Uni

我刚刚遇到了一个非常奇怪的行为。代码如下:

// So far everything's fine
val x: Try[Try[Unit]] = Try(Try{})
x: scala.util.Try[scala.util.Try[Unit]] = Success(Success(()))

// Compilation error should happen here
val x: Try[Unit] = Try(Try{})
// Wuut ?
x: scala.util.Try[Unit] = Success(())

我在这里期待一个编译错误,因为(据我所知)
Try[Try[Unit]
不应该分配给
Try[Unit]
,但在这种情况下,
Try{}
似乎会自动转换为
Unit
()
)。这怎么可能?为什么不可能?任何东西都可以是
Unit
vala:Unit=2

这与您编写时相同:

def test: Unit = {
  Try{}
}

因此,您应该将其视为在
{}
中包装
Try
,并丢失结果

任何类型都可以通过简单地删除值来适应正确上下文中的
单元
。在本例中,表达式的解析方式如下:

val x: Try[Unit] = Try {
  Try {}
  () // adapting the result to Unit
}
通过传递
-Ywarn value discard
,可以使scala编译器针对此类情况发出警告