Миша Кошелев
Миша Кошелев

Reputation: 1513

Groovy 'as' keyword to implement 2+ interfaces

I would like to implement a Glazed List that has both an AdvancedTableFormat and WritableTableFormat interface.

I am reading here: http://www.jroller.com/aalmiray/entry/glazedlists_groovy_not_your_regular

and for one interface it seems this is possible in Groovy with the "as" keyword:

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

Is it somehow possible to do this for two interfaces? If so how?

Thank you!

Misha

Upvotes: 2

Views: 1479

Answers (3)

Connex
Connex

Reputation: 21

I wonder if you want to implement 2 or more interfaces on the fly, and do not prefer to 'hard code' like
interface abc extends aaa,bbb,ccc {}?

May be you can try the following code:

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();

Upvotes: 2

Christoph Metzendorf
Christoph Metzendorf

Reputation: 8078

The "as" keyword is just a fancy way of invoking Groovy's asType(Class) method, which takes only a single Class as an argument. Therefore you can't directly use "as" with more than one interface (unless you take frm's approach and combine the interfaces in one super interface).

Upvotes: 4

frm
frm

Reputation: 3486

You can create a new interface that extends the two interfaces you are interested in.

interface PersonalizedTableFormat extends AdvancedTableFormat, WriteableTableFormat {
}

You can cast the object you return to the new interface.

return object as PersonalizedTableFormat;

Upvotes: 5

Related Questions