【问题标题】:getting a java.io.Serializable from Option[..] in Scala从 Scala 中的 Option[..] 获取 java.io.Serializable
【发布时间】:2016-10-17 19:22:26
【问题描述】:

(几周前刚开始使用 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?

【问题讨论】:

    标签: scala null scala-option


    【解决方案1】:

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

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

    getOrElseOption 上定义。 Option 可以是Some(value)None

    optionnone 时,getOrElse 返回default

    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 属于同一类型,则结果类型将为a 类型或b 类型

    如果ab 是相同类型的not,则结果类型将是最接近的常见超类型,在您的情况下为java.io.Serializable

    注意

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

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

    【讨论】:

    • 瞧,这正是我提出问题后的想法。不过,我希望它是“任何”,就像在您的“Some(1).getOrElse(“Hello”) 示例中一样,但我想它会回到 Java 类层次结构上,嗯?
    • @alexakarpov 因为用户和字符串最接近的通用超类型是可序列化的
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2020-04-04
    • 2019-05-22
    • 1970-01-01
    • 2019-08-15
    • 2019-09-06
    • 1970-01-01
    • 2016-11-08
    相关资源
    最近更新 更多