为什么可以尝试[尝试[单位]]值来尝试[单位]?

时间:2016-01-25 15:31:21

标签: 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[Unit] = Success(())

我在这里期待编译错误,因为(据我所知),Try[Try[Unit]]不应该分配给Try[Unit],但在这种情况下似乎是Try{}自动转换为Unit())。怎么可能?

2 个答案:

答案 0 :(得分:6)

只需删除值,即可在正确的上下文中将任何类型调整为Unit。在这种情况下,表达式解析如下:

val x: Try[Unit] = Try {
  Try {}
  () // adapting the result to Unit
}

您可以通过传递-Ywarn-value-discard来使scala编译器针对此类情况发出警告。

答案 1 :(得分:2)

为什么不呢?任何事情都可以是Unitval a: Unit = 2

这和你写的时候一样:

def test: Unit = {
  Try{}
}

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