我能够为我的类实现运算符覆盖,但我无法以任何方式为 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 也说一切都应该正常。
plus
超载(您所看到的行为)。
您的版本
String.metaClass.plus = { "-" }
意味着这个版本:
String.metaClass.plus = { Object it -> "-" }
(默认情况下 groovy
闭包有一个默认的单个参数 it
,其类型为 Object
(或者用时髦的话来说是 def
)。
所以现在 String 上有两个
plus
并且 JVM 选择最佳匹配,
当调用它时(工作中的多态性)...这不是你的,因为
对于您的示例参数,Object
比 CharSequence
更通用。
所以你可以像这样强制你的版本:
static void main(String[] args) {
String.metaClass.plus = { "-" }
print "left" + 42 // ⇒ -
}
将参数类型强制为
String
——就像你在你的代码中所做的那样
工作示例——当使用以下命令调用时,使您的函数现在成为所选函数
一个 String
参数(可能是任何参数,因为 Groovy 可能会强制)。
旁注:
写出像这样的闭包
{
String r -> "-"
}
对读者有极大的误导。参数通常保存在 带有左大括号的线。
{ String r ->
"-"
}