WEB开发网
开发学院软件开发Java 实战 Groovy: @Delegate 注释 阅读

实战 Groovy: @Delegate 注释

 2009-09-28 00:00:00 来源:WEB开发网   
核心提示: 在静态语言中使用 duck 类型的限制尽管 AllCapsString 目前拥有 String 的所有行为,但是它仍然不是一个真正的 String,实战 Groovy: @Delegate 注释(5),在 Java 代码中,无法使用 AllCapsString 作为 String 的临时替代,如

在静态语言中使用 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,但是它却具有两者的行为。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:实战 Groovy Delegate

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接