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?
 

最新文章

  1. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统
  2. 获取documents、tmp、app、Library的路径的方法
  3. 跨平台C的IDE
  4. 李洪强漫谈iOS开发[C语言-048]-打印平方表
  5. Liferay7 BPM门户开发之26: 集成Activiti到Liferay7
  6. 《ASP.NET1200例》ListView 控件与DataPager控件的结合&lt;二&gt;
  7. jQuery Mobile 基础
  8. ubuntu下安装花生壳
  9. CentOS 5.x版本升级PHP
  10. (三)CSS高级语法
  11. oracle 大表删除数据后,回收空间的问题。
  12. WebForm Repeater的事件、后天数据展示--2017年1月8日
  13. C++中的cout输出机制
  14. input时间输入框小解
  15. C++模板入门教程(一)——模板概念与基本语法
  16. [crypto] AEAD是啥
  17. java中实现全局变量的功能
  18. MongoDB 进程控制系列一:查看当前正在执行的进程
  19. VS2015安装ASP.NET MVC4
  20. nginx 知识点

热门文章

  1. rsync 服务及部署
  2. 使用 vi 命令创建一个cpp文件
  3. JAVA设计模式之组合模式(composite)
  4. Coursera课程笔记----计算导论与C语言基础----Week 9
  5. Synchronized加锁、锁升级和java对象内存结构
  6. MYSQL 日月周季年分组
  7. 基于mykernel 2.0编写一个操作系统内核
  8. LabVIEW(数据库自动编号)
  9. linux wc 的用法-linux 下统计行数、单词数、字符个数
  10. 让写作省心一点——Markdown和CSS实践