Groovy 对接口方面的支持比Java灵活多了,是否过于灵活了?
看下面的示例:
//1
new Thread( {println "running"} as Runnable ).start();
这个例子说明,一个“{}”,你想把它做什么接口调用,就可以做什么接口来调用,完全不受名字的限制。
//2
interface X
{ void f(); void g(int n); void h(String s, int n); }
x = {Object[] args -> println "method called with $args"} as X
x.f()
x.g(1)
x.h("hello",2)
这个例子充分体现了接口支持的“智能”,Groovy非常善解人意。
//3
impl = [
i: 10,
hasNext: { impl.i > 0 },
next: { impl.i-- },
]
iter = impl as Iterator
while ( iter.hasNext() ) println iter.next()
这个例子展示了一个Map和一个对象没有什么本质的区别,所以Map完全可以 as 成一个接口来使用,这和JavaScript有点儿相似了。