实战 Groovy: @Delegate 注释
2009-09-28 00:00:00 来源:WEB开发网在静态语言中使用 duck 类型的限制
尽管 AllCapsString 目前拥有 String 的所有行为,但是它仍然不是一个真正的 String。在 Java 代码中,无法使用 AllCapsString 作为 String 的临时替代,因为它并不是一个真正的 duck — 它只不过是冒充的。(动态语言被认为是使用 duck 类型;Java 语言使用静态 类型。。换句话说,由于 AllCapsString 并未真正扩展 String(或实现并不存在的 Stringable 接口),因此无法在 Java 代码中与 String 互相替换。清单 7 展示了在 Java 语言中将 AllCapsString 转换为 String 的失败例子:
清单 7. Java 语言中的静态类型阻止 AllCapsString 与 String 之间互相替换
public class JavaExample{
public static void main(String[] args){
String s = new AllCapsString("Hello");
}
}
$ javac JavaExample.java
JavaExample.java:5: incompatible types
found : AllCapsString
required: java.lang.String
String s = new AllCapsString("Hello");
^
1 error
因此,通过允许您扩展被最初的开发人员明确禁止扩展的类,Groovy 的 @Delegate 并没有真正破坏 Java 的 final 关键字,但是您仍然可以获得与在不越界的情况下相同程度的威力。
请记住,您的类可以拥有多个 delegate。假设您希望创建一个 RemoteFile 类,它将同时具有 java.io.File 和 java.net.URL 的特征。Java 语言并不支持多重继承,但是您可以非常接近一对 @Delegate,如清单 8 所示。RemoteFile 类不是 File 也不是 URL,但是它却具有两者的行为。
- ››Groovy轻松入门
- ››实战:企业使用交换机VLAN路由配置
- ››实战案例分析:高质量软文对网站百度排名的影响
- ››实战经验浅谈网站搬家后的优化工作
- ››实战Active Directory站点部署与管理,Active Dir...
- ››实战操作主机角色转移,Active Directory系列之十...
- ››实战经验:巧用微博推广淘宝网店
- ››实战iPhone GPS定位系统
- ››实战Linux环境配置DBD:Oracle模块
- ››实战DeviceIoControl系列之一:通过API访问设备驱...
- ››实战DeviceIoControl系列之二:获取软盘/硬盘/光盘...
- ››实战DeviceIoControl系列之三:制作磁盘镜像文件
更多精彩
赞助商链接