alexakarpov
alexakarpov

Reputation: 1920

getting a java.io.Serializable from Option[..] in Scala

(just started with Scala a few weeks ago, so bear with me)

Reading/trying out this little article here, ran into some surprises

http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html

After defining a case class User as described:

case class User(
  id: Int,
  firstName: String,
  lastName: String,
  age: Int,
  gender: Option[String])

object UserRepository {
  private val users = Map(1 -> User(1, "John", "Doe", 32, Some("male")),
                          2 -> User(2, "Johanna", "Doe", 30, None))
  def findById(id: Int): Option[User] = users.get(id)
  def findAll = users.values
}

, here are the gets I observe:

> scala> UserRepository.findById(1)
> res34: Option[User] = Some(User(1,John,Doe,32,Some(male)))
> 
> scala> UserRepository.findById(1).get
> res35: User = User(1,John,Doe,32,Some(male))
> 
> scala> UserRepository.findById(1).getOrElse("N/A")
> res36: java.io.Serializable = User(1,John,Doe,32,Some(male))
>
> scala> UserRepository.findById(3).getOrElse("N/A")
> res37: java.io.Serializable = N/A

The first two are what I expected, but the second two aren't; both the case of existing and non-existing Users. Why java.io.Serializable, all of the sudden?

Upvotes: 2

Views: 4840

Answers (1)

Nagarjuna Pamu
Nagarjuna Pamu

Reputation: 14825

To understand this you have to understand what is getOrElse

final def getOrElse[B >: A](default: => B): B

getOrElse is defined on Option. Option can be Some(value) or None.

getOrElse returns default when option is none

val map = Map(1 -> 2)

map.get(1) returns option

scala> Some(1).getOrElse(2)
res3: Int = 1

scala> Some(1).getOrElse("Hello")
res4: Any = 1


scala> case class User(name: String)
defined class User

scala> (None: Option[User]).getOrElse("a")
res12: java.io.Serializable = a

scala> (None: Option[User]).getOrElse(1)
res7: Any = 1

Coming to the point

Some(a).getOrElse(b)

if a and b are of same type then resultant type will be a type or b type

if a and b are not of same type then resultant type will be nearest common super type which is java.io.Serializable in your case.

Note that

1) nearest common super type for User and String is Serializable

2) nearest common super type for User and Int is Any

Upvotes: 7

Related Questions