标签:object类 标准 需要 通用 object cti equals font nbsp
Scala中,最顶端的两个trait是Nothing和Null:
Nothing:
abstract final class Nothing extends Any
Nothing是其它任何类型的子类型(包括scala.Null)。Nothing类型没有实例。尽管Nothing类型没有实例,然而它在一些方面也是非常有用的。例如:
Null: Null是任何引用类型的子类型,它唯一的实例就是null引用。由于Null不是数值类型的子类型,故null不是数值类型的成员。举例来说,就是不能将null赋值给一个scala.Int类型
abstract final class Null extends AnyRef
Any:Any类是个比较重要的类,其中定义了isInstanceOf和asInstanceOf等方法,以及equals、hashCode等对象的基本方法,Any类,有点像Java中的Object基类
abstract class Any
类Any是Scala类层次结构的根。Scala执行环境中的每一个类都直接或间接地从这个类继承。
从Scala 2.10开始,可以直接继承Any使用任何通用的特性(Any类中的方法,equals,asInstanceOf等)。一个普遍的特征,是一个trait继承Any后,只有defs这个成员,并且不需要初始化。通用特性的主要用例是允许对值类(value class)的方法进行基本继承。看下例:
trait Printable extends Any { def print(): Unit = println(this) } class Wrapper(val underlying: Int) extends AnyVal with Printable val w = new Wrapper(3) w.print()
AnyRef:AnyRef类,增加了一些多线程的方法,比如wait、notify/notifyAll、synchronized等,也是属于Java Object类的一部分
Class AnyRef是所有引用类型的根类。除了值类型之外,所有类型都来自这个类。
class AnyRef extends Any
AnyVal:AnyVal是所有值类型的根类,它描述在底层主机系统中未实现的值。Value类是在Sc ala语言规范第12.2节中指定的。
标准的实现包括9个AnyVal子类型:
其它一些分组方式:
在Scala 2.10之前,AnyVal是一个封闭的特性。但是呢,从Scala 2.10开始,可以定义AnyVal的子类,称为用户定义的超值类,它是由编译器专门处理的。适当定义的user value类提供了一种方法,通过在运行时避免对象分配,以及用静态方法调用替换虚拟方法调用,从而提高用户定义类型的性能。
用户自定义的值类,如何避免对象分配呢?
一个小实例,可以参考:
class Wrapper(val underlying: Int) extends AnyVal { def foo: Wrapper = new Wrapper(underlying * 19) }
需要注意的是,用户定义的值类是有限制的,并且在某些情况下,仍然必须在运行时分配一个值类实例。这些限制和环境在价值类和通用特性中得到了更详细的解释,这里就不解释了,可以参考这里。
标签:object类 标准 需要 通用 object cti equals font nbsp
原文地址:https://www.cnblogs.com/dreamfor123/p/9336448.html