我目前正在使用Groovy开发一个使用Java编写的数学相关API的DSL。
Expression
类有一个带有以下签名的方法:
public Constraint equals(Expression that)
我们想要定义一个约束,它只会在以后进行评估。
是否可以使用我们的==
实施覆盖equals
,以便它不会返回boolean
但Constraint
?
答案 0 :(得分:4)
不,据我所知,这是不可能的......
==
运算符在DefaultTypeTransformation.java::compareEqual
结束时会返回boolean
,所以即使你这样做了:
class Yay {}
class Woo {
String equals(Yay y) {
'hello'
}
}
println new Woo() == new Yay()
您将获得例外:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.compareEqual(DefaultTypeTransformation.java:641)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.java:684)
at ConsoleScript3.run(ConsoleScript3:9)
它适用于a.equals(b)
,但不适用于a == b