AnyVal是什么?

⭐️⭐️⭐️⭐️

  1. 值类型,Int、Long、Double等等继承了AnyVal的都是。

  2. 减少运行时装箱,不增加运行时开销的同时,获得数据类型的类型安全。

  3. jvm自身不支持值类型,所以存在必须进行分配的情况(真正实例化)

    1. 值类作为另一种类型使用时。(class Test extends AnyVal with SomeTrait; def test(a: Test): SomeTrait//返回的是SomeTrait才需要实例化,且SomeTrait是只能用def成员 )

    2. 值类被赋值给数组。

    3. 执行运行时类型测试,例如模式匹配,asInstanceOf方法。

隐式类和值类一起使用的例子:3.toHexString

  implicit class RichInt(val self: Int) extends AnyVal {
      def toHexString: String = java.lang.Integer.toHexString(self)
  }

在运行时,表达式3.toHexString被优化并等价于静态对象的方法调用(RichInt$.MODULE$.extension$toHexString(3)),而不是创建一个新实例对象,再调用其方法。

答到1.2及格,答到3或下面的限制中的4个,满分。

官网上值类型的限制:

  1. 必须只有一个主构造器。该构造器有且仅有一个public修饰的不可变(val)参数,且参数的类型不是用户自定义的值类。

  2. 不能有特殊的类型参数。

  3. 不能有嵌套或局部的类、特质或对象。

  4. 不能定义equals或hashCode方法。

  5. 必须是一个顶级类,或静态访问对象的一个成员。(非顶级类隐含一个父级的this,不满足条件1)

  6. 仅能有def为成员。尤其是,成员不能有惰性val、val或者var。

  7. 不能被其它类继承。隐式final。

  8. 结构化类型不能使用值类作为方法的参数或返回值类型。

Last updated

Was this helpful?