var v1 = 1
v1 = if(v1 != 0) 0;
println(v1)
我收到这样的错误。
[error] /Users/hoge/project/hello.scala:62: type mismatch;
[error] found : Unit
[error] required: Int
[error] v1 = if(v1 != 0) 0;
[error] ^
那么,返回Unit
类型的是什么?是“if”表达吗?我希望程序打印“0”。
答案 0 :(得分:2)
你得到这种类型错误,因为Scala强大的类型系统已经抓住了你已经忘记的极端情况。让我们仔细检查每一行。
scala> var v1 = 1
v1: Int = 1
此处我们声明了名为var
的{{1}},类型为v1
。
Int
哦,我们得到一个类型错误。我们正在尝试将scala> v1 = if (v1 != 0) 0;
error: type mismatch;
found : Unit
required : Int
v1 = if (v1 != 0) 0
的结果分配给if (v1 != 0) 0
,因此v1
表达式的类型最好为if
(请记住,Int
)。但是如果v1: Int
会发生什么,即。取而代之的是隐式v1 == 0
分支?
Scala将else
分支的结果默认为else
,因此在这种情况下,它将返回Unit
。显然,我们无法将Unit
分配给类型Unit
的值,因此编译器会正确地抱怨。
要修复此错误,请使用默认Int
值填写缺少的else
分支,或者在分支内移动Int
的分配,如v1
。
答案 1 :(得分:0)
这是因为当你使用时
v1 = if(v1 != 0) 0;
如果条件不满足,它仍在尝试将v1
分配给表达式。尝试将代码更改为
if(v1 != 0) v1 = 0;
Unit
有点像java中的void
。