2

(几周前刚开始使用 Scala,请耐心等待)

在这里阅读/试用这篇小文章,遇到了一些惊喜

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

按照描述定义案例类用户后:

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
}

,这是我观察到的结果:

> 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

前两个是我所期望的,但后两个不是;现有用户和非现有用户的情况。为什么突然出现 java.io.Serializable?

4

1 回答 1

6

要了解这一点,您必须了解什么是getOrElse

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

getOrElse定义在 上OptionOption可以是Some(value)None

getOrElse什么default时候返回optionnone

val map = Map(1 -> 2)

map.get(1)返回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

说到重点

Some(a).getOrElse(b)

如果ab属于同一类型,则结果类型将是atype 或btype

如果ab属于not同一类型,则结果类型将是java.io.Serializable您的情况最接近的常见超类型。

注意

User1)和 String最接近的公共超类型是可序列化的

2) 和 Int 最接近的公共超类型User是 Any

于 2016-10-17T19:33:34.603 回答