我正在尝试利用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方法?
答案 0 :(得分:2)
使用点表示法调用属性的setter方法的快捷方式不进行类型检查。相反,它似乎使用具有给定名称的方法列表中的第一个条目并调用它。
您还可以阅读有关Groovy属性处理缺点的Pyrasun's扩展注释。
如果你想绕过这个(错误的)行为,你必须直接调用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
}