Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Scala中的选项[…]获取java.io.Serializable_Scala_Null_Scala Option - Fatal编程技术网

从Scala中的选项[…]获取java.io.Serializable

从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

(几周前刚开始使用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", 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,最接近的通用超级类型是Any

lo,这正是我问这个问题后想到的。虽然我希望它是“Any”,就像您的“Some(1).getOrElse(“Hello”)示例一样,但我认为它会回到Java类层次结构上,嗯?@alexakarpov,因为用户和字符串最接近的公共超类型是可序列化的