匿名方法使用泛型值作为参数

时间:2013-03-05 12:44:13

标签: java generics anonymous-types anonymous-methods

我坚持使用匿名方法的java传统, 我正在使用第三方库,它具有通用接口,将table_name作为其泛型类型

TableQueryCallback<WYF_Brands> =new TableQueryCallback<WYF_Brands>() {
    @Override
    public void onCompleted(List<WYF_Brands> arg0, int arg1,
        Exception arg2, ServiceFilterResponse arg3) {
        // TODO Auto-generated method stub
    }
};

这里WYF_Brands是我的桌名。

我想要的是

TableQueryCallback<WYF_Users> =new TableQueryCallback<WYF_Users>() {
    @Override
    public void onCompleted(List<WYF_Users> arg0, int arg1,
        Exception arg2, ServiceFilterResponse arg3) {
        // TODO Auto-generated method stub
    }
};

WYF_Users是我的另一张桌子。

要求:我想以可重复使用的方式对我的所有表使用这样的方法。

我在数据库中有多个表,并且不会为不同的表创建不同的方法。我不知道如何使用可以接受任何表名作为参数的泛型。

另一件事是这个接口是第三方库的一部分,因此我无法更改它,因为它在可执行jar文件中。

我使用java作为编程语言。

2 个答案:

答案 0 :(得分:1)

听起来你只想要一个通用的方法:

public <T> TableQueryCallback<T> createTableQueryCallback() {
    return new TableQueryCallback<T>() {
        @Override
        public void onCompleted(List<T> list, int arg1,
                Exception arg2, ServiceFilterResponse arg3) {
            // I'm assuming the implementation here would be the same each time?
        }
    };
}

虽然我只是试图创建一个名为的嵌套类来代替:

private static SomeSpecificTableQueryCallback<T> implements TableQueryCallback<T> {
    @Override
    public void onCompleted(List<T> list, int arg1,
            Exception arg2, ServiceFilterResponse arg3) {
        // I'm assuming the implementation here would be the same each time?
    }
}

...我不明白为什么匿名为你提供任何好处。

答案 1 :(得分:1)

我假设您有WYF_BrandsWYF_Users和所有其他表的公共基类/接口。设为WYF_Base。我还假设,这个基类/接口足以让您实现常用方法。如果是这样,那么你可以像这样实现一次方法:

public class CommonTableQueryCallback <T extends WYF_Base>
    implements TableQueryCallback <T>
{
    @Override
    public void onCompleted(List <T> list, int n,
        Exception exception, ServiceFilterResponse response) {
        // Implement your logic here.
        // All elements of `list` are guaranteed to extend/implement WYF_Base
        // And compiler knows this!

        WYF_Base e = list.get (0); // This is correct!
    }
}

然后您可以使用此类,如下所示:

TableQueryCallback <WYF_Brands> callback = 
    new CommonTableQueryCallback <WYF_Brands> ();