2.4

值类 value class

值类的设计目的是使得隐式转换高效进行。
特点:

  1. 继承自AnyVal
  2. 主构函数中包含且仅包含一个val字段
  3. 没有其他字段或构造函数
  4. 自动提供equals、hashCode函数,基于比较和散列包含的唯一字段

早定义 early definition
覆盖早定义,为了解决父类初始化中能正确获取被子类覆盖的字段/方法值问题。(语法很不优雅)

class Sup{
    val n = 5
    val p = n+1
}
// no using early-definition 
class Sub{
    override val n = 10
}
// new Sub().p : 1  // Unexpected value <= not 11 ( neither 6)
// 实例构造过程:
/*
1. new Sub() => 开辟内存空间(置字段值为等价0),准备构造自己前构造父类
2. 设置父类字段n为5
3. 设置字段p的值(通过调用字段n的getter然后加1),由于n的getter被覆盖,调用子类覆盖方法,因子类在等待父类初始化完成而未开始对自身字段赋值,子类字段getter返回等价0,导致父类初始化时p为0+1即1
3. 子类的父类初始化完成后开始构造自身,置字段n为10.
*/

// early-definition
class Sub extends {override val n=10} with Sup
// new Sub().p : 11  // OK

equality 相等性

一般用==比较,如值、集合(位置及对应元素)。

比较引用是否指向同一地址(是否为同一个实例对象)时使用方法eq

new String("a") == new String("a")  // true
new String("a") eq new String("a")  // false

List(1,2,3) == Vector(1,2,3) // true

要自定义相等性,需覆盖方法equals(Object)即override def equals(o:Any),需要注意的是,参数类型是Any,而不是自身类型(否则成了重载),也不是覆盖方法==,即不是override def ==(o:Any)或参数类型为自身类型的==方法。

TODO
canEqual, equals

特质 trait

  1. 类可以实现任意多特质
  2. 特质可要求实现类具备特定字段、方法、或超类
  3. 特质可提供方法实现和字段(状态)
  4. 类实现的多个特质间有层结构,特质顺序决定行为
posted @   秋渡晚枫  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示