groovy 中 this 的语义有问题。下面的代码会报异常,说 secret2 方法找不到:
new Sub().doSomething()
class Parent {
def doSomething() {
secret().secret2()
}
private def secret() {
println "secret"
this
}
private def secret2() {
println "secret 2"
this
}
}
class Sub extends Parent {
def doSomething() {
super.doSomething()
}
}
将 Parent#doSomething() 修改一下,打印出 secret() 的返回值类型后得到:
def doSomething() {
println secret()
}
输出:
引用
secret
class Sub
this 指向的是子类型。所以不要把 chaining 用在 private 方法上。因为子类型无法访问到父类型的 private 方法,返回 this 就会引起子类型报错。
补
在 Java 试验的结果是 println 显示 this.getClass() 为 Sub,与上面的 Groovy 代码结果一致。但是 Java 下调用是成功的。也就是说 Java 并不是像表面上 println 显示的那样简单地直接使用 Sub 的实例去调用 secret2(),而是隐式用的 Parent 实例去调用 secret2()。Groovy 在动态调用方法时没有考虑到这点,直接用 "this" 去调,导致找不到 secret2() 这个函数。
补2
这个问题现在看来比较严重。如果父类中的私有方法调用了另一个私有方法,那么子类如果在运行时用到了这个父类的私有方法,就会抛异常。示例:
new Sub().doSomething()
class Parent {
def doSomething() {
secret()
}
private def secret = {
secret2()
}
private def secret2 = {
println "secret 2"
}
}
class Sub extends Parent {
def doSomething() {
super.doSomething()
}
}
所以,父类的私有方法不能调用其它的私有方法。
补3
在 codehaus 上找到了与这个问题本质上一样的 bug report:
http://jira.codehaus.org/browse/GROOVY-3073。Jochen Theodorou 说这是因为 Groovy 当前的 MOP(Meta Object Protocol)不支持造成的。预计会在 Groovy 2.0 中解决这个问题。
分享到:
相关推荐
Written by core members of the Groovy language team, this book presents Groovy like no other can—from the inside out. With relevant examples, careful explanations of Groovy's key concepts and ...
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...
groovy入门经典,groovyeclipse 插件
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
Groovy轻松入门—搭建Groovy开发环境 Groovy轻松入门—搭建Groovy开发环境
Groovy
groovy
groovy-2.3.6-installer windows安装版本
什么是 Groovy? Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,...
This book covers Groovy fundamentals, such as installing Groovy, using Groovy tools, and working with the Groovy Development Kit (GDK). You'll also learn more advanced aspects of Groovy, such as ...
groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2
groovy的帮助文档 !!!!!
Groovy jar包 3.0.
groovy 源码
Groovy 教程。简单的groovy教程。
Groovy 调用 Java 类groovy 调用 Java class 十分方便,只需要在类前导入该 Java 类,在 Groovy 代码中就可以无缝使用该
Eclipse Groovy插件 Eclipse Groovy插件 Eclipse Groovy插件 Eclipse Groovy插件