最近在看《自己动手写java虚拟机》这本书,跟着书敲代码,怎么敲出来和书上的结果不一样。。书上好像只实现了其中一个,就可以用接口类型代表类类型对象了。。。不知道怎么做到的![QQ图片20180425091639.png](https://static.studygolang.com/180425/d9fbc1a29eb76a6460511032c2b47ee4.png)![QQ图片20180425094932.png](https://static.studygolang.com/180425/4e465a223e4b8d0d466aa4d76d3bc131.png)![QQ图片20180425095005.png](https://static.studygolang.com/180425/ecd2c3d78ecd27e5fbb4fe0cd4a60486.png)![QQ图片20180425095026.png](https://static.studygolang.com/180425/21c26d945b4a3a74e2a17fae94c8a3ba.png)
方法集的问题,类型有自己的方法集(也就是这个类型实现了那些方法),方法集会影响到接口实现规则 ,也就是说一个类型是否实现了某个接口,是根据这个类型的方法集来判断的。具体规则如下:
1. 类型 T 方法集包含全部 receiver T 方法;
2. 类型 *T 方法集包含全部 receiver T + *T 方法;
3. 如类型 S 包含匿名字段 T,则 S 方法集包含 T 方法;
4. 如类型 S 包含匿名字段 *T,则 S 方法集包含 S + T + *T 方法;
5. 不管嵌入 T 或者 *T,*S 的方法集总是包含 S + *S + T + *T 方法;
你这个例子里面 base.NoOperandsInstruction 作为 NOP 的匿名字段,从最后一张图上可以看到 nop 为指针类型,所以参考上面的第5条规则即可明白。
#7
更多评论