2016-10-17 5 views
0

(gerade vor ein paar Wochen mit Scala begonnen, so mit mir tragen)eine java.io.Serializable von Option bekommen [..] in Scala

Lesen/heraus hier, um diesen kleinen Artikel versucht, in einigen Überraschungen lief

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

einen Fall Klasse Benutzer wie beschrieben Nach der Definition:

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 
} 

, hier sind die bekommt ich beobachte:

012.351.
> 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 

Die ersten beiden sind, was ich erwartet habe, aber die zweiten beiden sind nicht; sowohl bei bestehenden als auch bei nicht vorhandenen Benutzern. Warum java.io.Serializable, plötzlich?

Antwort

3

Um dies zu verstehen, Sie zu verstehen, was getOrElse ist

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

getOrElse auf Option definiert ist. Option kann Some(value) oder None sein. default

getOrElse kehrt zurück, wenn option ist none

val map = Map(1 -> 2)

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

zum Punkt kommend

Some(a).getOrElse(b)

wenn a und b gleichen Typ sind dann resultierender Typ a Typ oder b Typ

wenn a und b sind not von gleichem Typ sein, dann wird resultierender Typ am nächsten gemeinsamen Super-Typ sein, die java.io.Serializable in Ihrem Fall ist .

Beachten Sie, dass

1) am nächsten gemeinsamen Super-Typ für User und String Serializable ist

2) am nächsten gemeinsamen Super-Typ für User und Int Alle

+0

siehe, das ist _exactly_, was ich von nachdem ich die Frage gestellt habe. Ich habe jedoch erwartet, dass es "Any" ist, genau wie in Ihrem Beispiel von "Some (1) .getOrElse (" Hello "), aber ich nehme an, dass es auf die Java-Klassenhierarchie zurückgreift, wie? – alexakarpov

+0

@alexakarpov, weil der nächste gemeinsame Super-Typ für User und String serialisierbar ist – pamu