Any, AnyRef e AnyVal sono classi, ma questo non ha corispondenza con Java ed il bytecode sulla jvm, in Java abbiamo le "primive" (int,double..) che non si possono estendere e si usano con gli operatori e non con dei metodi.
AnyRef e AnyVal estendono Any, il sotto tipo di tutto e' Nothing che serve a definire None come Option[Nothing] e Nil come List[Nothing]
scala> def getAStringMaybe(num: Int): Option[String] = {
| if ( num >= 0 ) Some("A positive number!")
| else None // A number less than 0? Impossible!
| }
scala> Nil
res4: Nil.type = List()
scala> Nil.length
res5: Int = 0
scala> Nil + "ABC"
res6: List[java.lang.String] = List(ABC)Da leggere: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
Nothing si definisce come:
def ??? : Nothing = throw new NotImplementedError
con ??? che sta per "anything that hasn't been implemented yet"
Null e' un tratto e serve a dare compatibilita' al "null" di Java e le lib in uso.
scala> def tryit(thing: Null): Unit = { println("That worked!"); }
tryit: (Null)Unit
scala> tryit("hey")
<console>:6: error: type mismatch;
found : java.lang.String("hey")
required: Null
tryit("hey")
^
scala> val someRef: String = null //// !!! va in errore sulla compiulazione sara' un riferimento a null a run time !!!!
someRef: String = null
scala> tryit(someRef)
<console>:7: error: type mismatch;
found : String
required: Null
tryit(someRef)
^
scala> tryit(null)
That worked!
scala> val nullRef: Null = null
nullRef: Null = null
scala> tryit(nullRef)
That worked!Unit e' il "void" di Java
def execute(code: => Unit):Unit = {
// do something before
code
// do something after
}