我刚刚遇到一种非常奇怪的行为。这是代码:
// 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
(()
)。怎么可能?
答案 0 :(得分:6)
只需删除值,即可在正确的上下文中将任何类型调整为Unit
。在这种情况下,表达式解析如下:
val x: Try[Unit] = Try {
Try {}
() // adapting the result to Unit
}
您可以通过传递-Ywarn-value-discard
来使scala编译器针对此类情况发出警告。
答案 1 :(得分:2)
为什么不呢?任何事情都可以是Unit
:val a: Unit = 2
。
这和你写的时候一样:
def test: Unit = {
Try{}
}
因此,您应该将其视为在Try
中包裹{}
并丢失结果