为什么加号运算符重载对凹槽中的字符串不起作用?

问题描述 投票:0回答:1

我能够为我的类实现运算符覆盖,但我无法以任何方式为 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()
}

Groovy 在线编译器的示例

更新。

我成功达到了预期的结果。我刚刚将 String 类型添加到匿名函数参数中。

//Old - non-working version.
String.metaClass.plus = {
    r -> "-";
}

//New - working version.
String.metaClass.plus = {
    String r -> "-";
}

问题还是一样,为什么旧版本不行,新版本可以?在我正在观看的课程中,一切正常,ChatGPT 也说一切都应该正常。

groovy operator-overloading
1个回答
0
投票

Groovy 已经有了

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 r -> "-"
}

对读者有极大的误导。参数通常保存在 带有左大括号的线。

{ String r -> 
    "-"
}
© www.soinside.com 2019 - 2024. All rights reserved.