groovy学习8接口

代码
/**
* @author <a href="mailto:zhangting@taobao.com">张挺</a>
* @since 2010-4-6 11:12:33
*
*/
//Implement interfaces with a closure

// a readable puts chars into a CharBuffer and returns the count of chars added,这个5是返回值-_-b
def readable = { it.put("12 34".reverse()); 5} as Readable

// the Scanner constructor can take a Readable
def s = new Scanner(readable)
assert s.nextInt()
== 43

//使用闭包实现多方法接口,闭包将会被每个接口调用,参数需要匹配
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)

//Implement interfaces with a map

impl
= [
i:
10,
hasNext: { impl.i
> 0 },
next: { impl.i
-- },
]
iter
= impl as Iterator
while (iter.hasNext())
println iter.next()

//You only need to implement those methods that are actually called,
//
but if a method is called that doesn't exist in the map a NullPointerException is thrown.
//
你只需要实现需要被调用的方法,但是一旦使用到没有实现的方法,就会报NPE
x = [f: {println "f called"}] as X
x.f()
//x.g() // NPE here

//Be careful that you don't accidentally define the map with { }
//
不要用{}来定义map,接口里的每个方法都会调用{}闭包
x = { f: {println "f called"} } as X
x.f()
x.g(
1)

//class.forname得到的是interface的实例,而不是一种类型,可以用astype来取得接口类型
def loggerInterface = Class.forName('my.LoggerInterface')
def logger
= [
log: {Object[] params
-> println "LOG: ${params[0]}"; if (params.length > 1) params[1].printStackTrace() },
close: { println
"logger.close called" }
].asType(loggerInterface)
原文地址:https://www.cnblogs.com/xiziyin/p/1705392.html