从Scala中的选项[…]获取java.io.Serializable
(几周前刚开始使用Scala,请耐心等待) 在这里阅读/试用这篇小文章时,遇到了一些惊喜 按照所述定义案例类用户后:从Scala中的选项[…]获取java.io.Serializable,scala,null,scala-option,Scala,Null,Scala Option,(几周前刚开始使用Scala,请耐心等待) 在这里阅读/试用这篇小文章时,遇到了一些惊喜 按照所述定义案例类用户后: 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", 3
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会突然出现?要理解这一点,您必须理解什么是
getOrElse
final def getOrElse[B >: A](default: => B): B
getOrElse
是在选项上定义的<代码>选项可以是Some(value)
或None
getOrElse
当选项
为none
val-map=map(1->2)
map.get(1)
返回选项
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
开门见山
a.getOrElse(b)
如果a
和b
属于同一类型,则结果类型将为a
类型或b
类型
如果a
和b
不是同一类型的那么结果类型将是最接近的公共超类型,在您的情况下,它是java.io.Serializable
注意
1) 用户
的最近通用超类型,字符串可序列化
2) 对于User
和Int,最接近的通用超级类型是Anylo,这正是我问这个问题后想到的。虽然我希望它是“Any”,就像您的“Some(1).getOrElse(“Hello”)示例一样,但我认为它会回到Java类层次结构上,嗯?@alexakarpov,因为用户和字符串最接近的公共超类型是可序列化的