Groovy学习笔记——as操作符

在Groovy中,as操作符有两种用途:定义导入别名和类型转换。

 

1. 定义导入别名

只要在import一个类或方法的时候使用as操作符,就可以对其进行重命名:

Java代码  收藏代码
class A {  
    def val  
    def asType(Class t) {  
        assert t == Integer  
        val  
    }  
}  
def a = new A(val:123)  
assert a as int == 123  // 这里调用了A#asType方法  

  

 

2. 类型转换

语法为“变量 as 类型”,在执行这个操作时,将调用左操作数的类的asType方法:

Java代码  收藏代码
class A {  
    def val  
    def asType(Class t) {  
        assert t == Integer  
        val  
    }  
}  
def a = new A(val:123)  
assert a as int == 123  // 这里调用了A#asType方法  

  

也可以使用as操作符把一个map转换成一个bean:

Java代码  收藏代码
a = [val:321] as A  // 与new A(val:321)功能相同  
assert a.val == 321  

  

把一个list用as操作符转换成其他类型时,将使用该类型的合适的构造函数:

Java代码  收藏代码
class B {  
    def a  
    def b  
    B(a, b) {  
        this.a = a  
        this.b = b  
    }  
}  
def b = [1, 2] as B // 这里调用了B(a, b)构造函数  
assert b.a == 1 &&  b.b == 2  

  

可以把一个闭包转换成interface,如果该interface中有多个方法,则这些方法都会调用该闭包:

Java代码  收藏代码
interface X {  
    def f()  
    def g()  
    def h(a)  
}  
  
def x = { 100 } as X  
assert x.f() == 100  
assert x.g() == 100  
assert x.h(10) == 100   // 即使带了一个参数,但是还是调用该闭包  
  
def y = { t -> t } as X  
assert y.f() == null    // 缺少参数时,用null补足  
assert y.g() == null  
assert y.h(10) == 10  

  

也可以把一个闭包的map转换成interface:

Java代码  收藏代码
def z = [f:{ 1 }, g:{ 2 }, h:{ it * 3 }] as X  
assert z.f() == 1  
assert z.g() == 2  
assert z.h(3) == 9  

  

posted @ 2018-01-06 17:34  IT媚娘  阅读(487)  评论(0)    收藏  举报