将 Groovy 中的 == 重载为非 return 布尔值
Overload == in Groovy to not return boolean
我目前正在使用 Groovy 为用 Java 编写的与数学相关的 API 开发 DSL。
Expression
class 有一个具有以下签名的方法:
public Constraint equals(Expression that)
我们要定义一个约束,它只会在以后计算。
是否可以使用我们的 equals
实现来覆盖 ==
,这样它就不会 return boolean
,而是 Constraint
?
不,据我所知,这是不可能的...
==
运算符在某些时候以 DefaultTypeTransformation.java::compareEqual
结束,其中 returns 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
我目前正在使用 Groovy 为用 Java 编写的与数学相关的 API 开发 DSL。
Expression
class 有一个具有以下签名的方法:
public Constraint equals(Expression that)
我们要定义一个约束,它只会在以后计算。
是否可以使用我们的 equals
实现来覆盖 ==
,这样它就不会 return boolean
,而是 Constraint
?
不,据我所知,这是不可能的...
==
运算符在某些时候以 DefaultTypeTransformation.java::compareEqual
结束,其中 returns 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