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

null, scala, scala-option

Solution

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

Problem

(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?

Original source