groovy 运算符重载的一个小问题

J-will 发布于 2011/06/24 22:40
阅读 475
收藏 0
boolean equals (Object other) {
		if (null == other) return false  //problem!!!
	}
这上面第二行令我不解,在groovy中一切都是对象,运算符都是对象的方法,那么,这个null是对象?可是我调用 null.class 但是是空指针异常
如果我把第二行括号里改成 other == null 编译也能通过 ,我很奇怪,==这个是将要被重载的equals方法,这里有一种循环定义的感觉,就好像我这个方法还没写完,但是我在这个方法里面调用这个方法,这好像是一种没有尽头的递归。请问有高人能点拨一下吗?多谢啦!我是初学者。
加载中
0
streamlong
streamlong
对象的空用null表示的,但不代表null就属于对象
0
王在祥
王在祥

一般来说,o1 == o2 等同于 o1.equals(o2), 不过这里的等同,只是一个大致的意思,实际上的逻辑都在 DefaultTypeTransformation.compareEqual(o1, o2) 中实现,因此, o1 == o2 并不是直接解释为 o1.equals(o2), 在具体的实现中,它首先检查了 o1/o2是否是null,因此, null == other也不会产生NPE错误。

看这一类的高级语言中,对运算符来说,一般都有这种说法,但编译器本身或多或少都会做一些优化或特殊处理,如果想要查看到底做了什么特殊处理的话,你需要使用一个反编译工具,来进一步了解。当然,如果能够读懂字节码的话,你就更容易理解了。

返回顶部
顶部