2010-06-20 42 views
2

我想实现一个具有AdvancedTableFormat和WritableTableFormat接口的Glazed List。Groovy'as'关键字来实现2+接口

我读这里: http://www.jroller.com/aalmiray/entry/glazedlists_groovy_not_your_regular

和一个接口,似乎这是有可能在Groovy与“为”关键词:

# return new EventTableModel(linksList, [ 
#  getColumnCount: {columnNames.size()}, 
#  getColumnName: {index -> columnNames[index]}, 
#  getColumnValue: {object, index -> 
#   object."${columnNames[index].toLowerCase()}" 
#  }] as TableFormat) 

是它在某种程度上可能为两个接口做到这一点?如果是这样如何?

谢谢!

米莎

回答

4

您可以创建一个扩展两个接口,你有兴趣在一个新的接口。

interface PersonalizedTableFormat extends AdvancedTableFormat, WriteableTableFormat { 
} 

你可以投你回到新接口的对象。

return object as PersonalizedTableFormat; 
+0

这是整洁。顺便说一句,我可以实现一个接口_within_一个类,或者我必须始终在一个之外实现它吗?谢谢! – 2010-06-20 22:13:33

+0

Groovy接口的规则对于Java接口是相同的。您可以在您的类中将PersonalizedTableFormat定义为专用接口,并像您在示例中那样“随时”创建匿名内部类型。 – frm 2010-06-20 22:26:07

4

的“为”关键字只是调用Groovy的asType(Class)方法,该方法只需要一个单一的类作为参数的一个奇特的方式。因此,您不能直接在多个接口中使用“as”(除非您采用frm的方法并将接口合并到一个超级接口中)。

2

我想知道你是否想要实现2个或更多的接口,并且不喜欢'硬代码'如
interface abc extends aaa,bbb,ccc {}

可能是你可以试试下面的代码:

import static java.util.Collections.sort 
def doClose(Closeable c){ 
    c.close(); 
} 
def o = new Object() 
o.metaClass{ 
    compare{Object a,String b-> return a.size() - b.size()}; 
    close{println 'Lights out - I am closing'}; 
} 
o = new ProxyGenerator().instantiateDelegate([Comparator, Closeable], o) 
def items = ['a', 'bbb', 'cc'] 
sort(items, o); 
println items; 
doClose(o); 
println o.class.getInterfaces();