AnyVal是什么?
⭐️⭐️⭐️⭐️
值类型,Int、Long、Double等等继承了AnyVal的都是。
减少运行时装箱,不增加运行时开销的同时,获得数据类型的类型安全。
jvm自身不支持值类型,所以存在必须进行分配的情况(真正实例化)
值类作为另一种类型使用时。(
class Test extends AnyVal with SomeTrait; def test(a: Test): SomeTrait
//返回的是SomeTrait才需要实例化,且SomeTrait是只能用def成员 )值类被赋值给数组。
执行运行时类型测试,例如模式匹配,asInstanceOf方法。
隐式类和值类一起使用的例子:3.toHexString
在运行时,表达式3.toHexString被优化并等价于静态对象的方法调用(RichInt$.MODULE$.extension$toHexString(3)
),而不是创建一个新实例对象,再调用其方法。
答到1.2及格,答到3或下面的限制中的4个,满分。
官网上值类型的限制:
必须只有一个主构造器。该构造器有且仅有一个public修饰的不可变(val)参数,且参数的类型不是用户自定义的值类。
不能有特殊的类型参数。
不能有嵌套或局部的类、特质或对象。
不能定义equals或hashCode方法。
必须是一个顶级类,或静态访问对象的一个成员。(非顶级类隐含一个父级的this,不满足条件1)
仅能有def为成员。尤其是,成员不能有惰性val、val或者var。
不能被其它类继承。隐式final。
结构化类型不能使用值类作为方法的参数或返回值类型。
Last updated
Was this helpful?