groovy中的方法重载

时间:2010-05-22 16:51:41

标签: groovy overloading

我正在尝试利用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方法?

1 个答案:

答案 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
}