scala:Scala的类层级

 

  图释 11.1 Scala类层级图

  图释11.1展示了Scala类层级大纲层级顶端是类Any定义了包含下列思路方法:

final def (that: Any): Boolean  
final def !=(that: Any): Boolean  
def equals(that: Any): Boolean  
def hashCode: Int  
def toString: String  


  每个类都继承自AnyScala每个对象都能用!=或equals比较;用hashCode哈希;和用toString格式化类Any里等号和不等号思路方法和!=被声明为final因此它们不能在子类里面重载实际上总是和equals相同!=总是和equals相反因此独立类可以通过重载equals思路方法剪裁或!=意义我们会在本章后面展示个例子

  根类Any有两个子类:AnyVal和AnyRefAnyVal是Scala里每个内建值类父类有 9个这样值类:ByteShortCharIntLongFloatDoubleBoolean和Unit其中前 8个对应到Java原始类型它们值在运行时表示成Java原始值Scala里这些类例子都写成文本例如42是Int例子'x'是Char例子false是Boolean例子你不能使用创造这些类例子点被“小伎俩”值类都被定义为即是抽象又是final强制贯彻因此如果你写了:

scala>  Int  

  你就会得到:

< console>:5: error:  Int is abstract; cannot be instantiated  
 Int  
ˆ  


  另个值类Unit大约对应于Javavoid类型;被用作不返回任何有趣结果思路方法结果类型Unit只有个例子值被写作在7.2节中讨论过

  正如第 5章中解释过值类支持作为思路方法通用数学和布尔操作符例如Int有名为+和*思路方法Boolean有名为||和&&思路方法值类也从类Any继承所有思路方法你可以在解释器里测试: 

scala> 42.toString  
res1: java.lang.String = 42 
scala> 42.hashCode  
res2: Int = 42 
scala> 42 equals 42 
res3: Boolean = true 


  注意值类空间是扁平;所有值类都是scala.AnyVal子类型但是它们不是互相子类代的以它们区别值类类型的间可以隐式地互相转换例如需要时候类scala.Int例子可以自动放宽(通过隐式转换)到类scala.Long例子

  正如5.9节中提到过隐式转换还用来为值类型添加更多功能例如类型Int支持以下所有操作:

scala> 42 max 43 
res4: Int = 43 
scala> 42 min 43 
res5: Int = 42 
scala> 1 until 5 
res6: Range = Range(1, 2, 3, 4)  
scala> 1 to 5 
res7: Range.Inclusive = Range(1, 2, 3, 4, 5)  
scala> 3.abs  
res8: Int = 3 
scala> (-3).abs  
res9: Int = 3 


  这里解释其工作原理:思路方法minmaxuntilto和abs都定义在类scala.runtime.RichInt里并且有个从类Int到RichInt隐式转换当你在Int上没有定义在Int上但定义在RichInt上思路方法时这个转换就被应用了类似“助推器类”和隐式转换存在于其它值类隐式转换将在第21章讨论细节

  类Any个子类是类AnyRef这个是Scala里所有引用类基类正如前面提到在Java平台上AnyRef实际就是类java.lang.Object别名因此Java里写类和Scala里写都继承自AnyRef存在AnyRef别名代替使用java.lang.Object名称理由是Scala被设计成可以同时工作在Java和.Net平台在.NET平台上AnyRef是.Object别名如此说来你可以认为java.lang.Object是Java平台上实现AnyRef方式因此尽管你可以在Java平台上Scala里交换使用Object和AnyRef推荐风格是在任何地方都只使用AnyRef

  Scala类和Java类区别在于它们还继承自个名为ScalaObject特别记号特质理念是ScalaObject包含了Scala编译器定义和实现思路方法是让Scala执行更有效到现在为止Scala对象包含了单个思路方法名为$tag用于内部以提速模式匹配

Tags:  scalajava scala语言 netbeansscala scala

延伸阅读

最新评论

发表评论