我能够为我的类实现运算符覆盖,但我无法以任何方式为 String 实现它。为什么?
static void main(String[] args) {
String.metaClass.plus = {
r -> return "-";
}
print "left" + "right"
}
//I tried and so:
static void main(String[] args) {
String.metaClass.plus = {
r -> return "-".toString();
}
print "left".toString() + "right".toString()
}
更新。
我设法达到了预期的结果。我刚刚将 String 类型添加到匿名函数参数中。
//Old - non-working version.
String.metaClass.plus = {
r -> "-";
}
//New - working version.
String.metaClass.plus = {
String r -> "-";
}
问题还是一样,为什么旧版本不起作用而新版本起作用?在我正在观看的课程中,一切正常,ChatGPT 也说一切都应该正常。
Groovy 已经
plus
超载了(您所看到的行为)。您的版本
String.metaClass.plus = { "-" }
暗示了这个版本:(String.metaClass.plus = { Object it -> "-" }
默认情况下,groovy 闭包有一个默认的单个参数it
,它是类型Object
(或def
用 groovy 语言来说)。所以现在 String 上有两个
plus
,并且 JVM 在调用它时选择最佳匹配(工作中的多态性)...这不是你的,因为它 比你的示例参数Object
更通用。CharSequence
所以你可以像这样强制你的版本:
当使用参数(可能是任何参数,因为 Groovy 可能会强制)调用时,强制参数的类型
String
- 就像您在工作示例中所做的那样 - 使您的函数现在成为所选的类型。String
旁边注明:
写闭包就像
对读者有极大的误导。参数通常与左大括号保持一致。