ggenikus
ggenikus

Reputation: 235

Return type in If expression

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

Answers (2)

Daniel C. Sobral
Daniel C. Sobral

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

tenshi
tenshi

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

Related Questions