gpt4 book ai didi

groovy - groovy 中的方法重载

转载 作者:行者123 更新时间:2023-12-02 02:33:27 25 4
gpt4 key购买 nike

我正在尝试利用 groovy 脚本语法的便利性来分配属性,但在特定情况下遇到了麻烦。我一定在这里遗漏了一些简单的东西。我这样定义 A、B、C 类:

class A {

A() {
println "Constructed class A!"
}

}

class B {

B() {
println "Constructed class B!"
}

}

class C {

private member

C() {
println "Constructed class C!"
}

def setMember(A a) {

println "Called setMember(A)!"
member = a

}

def setMember(B b) {

println "Called setMember(B)!"
member = b

}

}

然后在脚本中尝试以下调用:

c = new C()

c.setMember(new A()) // works
c.member = new A() // works

c.setMember(new B()) // works
c.member = new B() // doesn't work!

最后的赋值导致错误:“无法将 B 类的对象转换为 A 类”。为什么它不像 A 类那样为 B 类调用正确的 setMember 方法?

最佳答案

使用点符号调用属性的 setter 方法的快捷方式不进行类型检查。相反,它似乎使用具有给定名称的方法列表中的第一个条目并调用它。

您还可以阅读 Pyrasun's扩展了对 Groovy 属性处理缺点的评论。

如果您想绕过这种(错误的)行为,您必须直接调用 setter,因为 Groovy 支持方法调用的类型检查。或者,您也可以使用

直接访问该字段而无需 setter

c.@member = new B()

或者您在一个单独的 setter 方法中自行进行类型检查:

def setMember(def param) {
if (param instanceof A) println "Called setMember(A)!"
if (param instanceof B) println "Called setMember(B)!"

member = param
}

关于groovy - groovy 中的方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2888911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com