Reputation: 235
I am learning scala and can't understand why:
def signum(arg: Int) = {
if(arg > 0 ) 1
else if(arg < 0) -1
else 0
}
Has Int
as return type signum (arg: Int): Int
But
def signum(arg: Int) = {
if(arg > 0 ) 1
else if(arg < 0) -1
else if(arg == 0) 0
}
Has AnyVal
signum (arg: Int): AnyVal
Upvotes: 18
Views: 3957
Reputation: 297155
In the absence of an explicit else
, Scala assumes this:
else ()
Where ()
is the value of Unit
. It's the value returned by println
or assignment to var
, for example.
This can be easily verified:
scala> val x = if (false) 1
x: AnyVal = ()
scala> x.isInstanceOf[Unit]
res3: Boolean = true
Upvotes: 21
Reputation: 26566
It happens because in the second case you have not specified final else
part. In this case the return type of this missing branch would be Unit
. So Scala compiler infers AnyVal
as a common parent of Int
and Unit
.
you can try to add explicit return type to the function signature:
def signum(arg: Int): Int = ...
It will not compile with following error:
found : Unit
required: Int
else if(arg == 0) 0
^
one error found
So the compiler tells you that result type of the last if
is actually Unit
and not Int
.
Upvotes: 24