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编译器针对此类情况发出警告