将 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