https://mp.weixin.qq.com/s/lzDmIHkUph3b1Fxgx66ySg
分析移位/取反操作在Intellij中提示错误的问题。
1. 问题
用到移位/取反的地方都会有错误提示:
提示信息为:
2. 分析
问题发生在对UInt变量,调用在Bits中定义的方法,然后把返回值依然作为UInt使用。但是Bits中定义的方法,返回的是Bits,这就产生了类型不匹配的问题。
以“>>”方法为例。
在Bits中的定义为:
其实现依赖于抽象方法do_>>。
do_>>在UInt类中实现:
对比发现在Bits中,do_>>返回Bits类型,而在UInt中,do_>>返回UInt类型。子类中的方法会覆盖父类中的方法。所以针对UInt对象调用do_>>方法时,返回的是UInt:
问题在于实际使用的不是do_>>,而是>>方法。>>只在Bits中定义,返回的是Bits。虽然其实现使用的是do_>>会返回UInt,但是这个返回的UInt会被转换为Bits对象,再作为>>的返回值返回。
3. 解决
有两个解决方法。
1) 在子类中也定义>>/<</~等这些方法,并返回子类类型
这样修改每一个子类中都要定义这一组方法,解决不了代码复用的问题。
2) 在Bits中,把返回值类型定义为this.type。有两个地方可以佐证这种写法:
a. pad方法
b. 检视意见
REVIEW TODO: should these return this.type or Bits?