我得error: value id is not a member of Nothing
与case Some(x) => x.id
。这不应该评估为Some
类型。
case class UserDbEntry(id: Int, username: String)
val users = List()
val lastTableIds = "user.1::paypal.1"
val lastUserId = lastTableIds.split("::")(0).split("\\.")(1)
//This does not compile
val id = users.lastOption match {
case Some(x) => x.id
case None => lastUserId
}
//This compiles
def getLastFetchId(x: Option[UserDbEntry]) = x match {
case Some(user) => user
case None => 1
}
但是使用显式类型List[UserDbEntry]
定义List这很好,在这种情况下编译器会成功推断出这种情况。我想这与编译器推理有关;如果我没错。只是如果存在类型不匹配的话,我预计与x不符合String
类型成员的错误。
这到底发生了什么?
答案 0 :(得分:4)
宣布:
val users = List()
编译器推断:
val users: List[Nothing] = List()
Nothing
没有id属性。但是,当您指定用户是List[UserDbEntry]
并调用lastOption
时,编译器可以理解Option中的元素是UserDbEntry
,它具有id属性,因此编译得很好。考虑到空列表将返回None
,这是Option[Nothing]
。