2

我有一个 GWT 应用程序,我需要在其中处理多种相似但不完全相同的数据类型。我想使用由 AsyncDataProvider 支持的 CellList 来显示它们。我试图避免创建多个 CellLists/AsyncDataProviders,所以我试图以一种通用的方式来做这件事。但是,我似乎无法弄清楚如何做到这一点。

我试过了:

private AsyncDataProvider<MyInterface> myDataProvider = new AsyncDataProvider<MyInterface>() {
            @Override
            protected void onRangeChanged(final HasData<MyInterface> display) {

                AsyncCallback<Type> callback = new AsyncCallback<Type>() {
                    @Override
                    public void onFailure(Throwable t) {
                        myDataProvider.updateRowData(0, new ArrayList<MyImplementation>());    
                    }
                    @Override
                    public void onSuccess(Type result) {
                        //some success logic               
                    }
                };
}

这不起作用,因为 MyImplementation 的集合不能替代 MyInterface 的集合。

我也试过:

private AsyncDataProvider<? extends MyInterface> myDataProvider = new AsyncDataProvider<MyInterface>() {
                @Override
                protected void onRangeChanged(final HasData<MyInterface> display) {

                    AsyncCallback<Type> callback = new AsyncCallback<Type>() {
                        @Override
                        public void onFailure(Throwable t) {
                            myDataProvider.updateRowData(0, new ArrayList<MyImplementation>());    
                        }
                        @Override
                        public void onSuccess(Type result) {
                            //some success logic               
                        }
                    };
    }

但我得到了错误:"The method updateRowData(int, List<capture#2-of ? extends MyInterface>) in the type AsyncDataProvider<capture#2-of ? extends MyInterface> is not applicable for the arguments (int, ArrayList<MyImplementation>)"

有任何想法吗?有没有可能做我想做的事情。还有其他选择,例如手动将它们全部转换为通用类型,但这似乎是一个以通用方式处理事物的好用例。

4

1 回答 1

0

试试这个,创建一个通用回调,它需要一个数据提供者并根据你的逻辑更新它

public class HelloCallBack<T> implements AsyncCallback<T> {

private HelloDataProvider<T> dataProvider;

@Override
public void onFailure(final Throwable caught) {

    dataProvider.updateRowData(0, new ArrayList<T>());

}

@Override
public void onSuccess(final T result) {
    // TODO Auto-generated method stub

}

public HelloDataProvider<T> getDataProvider() {
    return dataProvider;
}

public void setDataProvider(final HelloDataProvider<T> dataProvider) {
    this.dataProvider = dataProvider;
}

}

现在创建一个通用的数据提供者

public class HelloDataProvider<T> extends AsyncDataProvider<T> {

@Override
protected void onRangeChanged(final HasData<T> display) {

    final HelloCallBack<T> callBack = new HelloCallBack<T>();
    callBack.setDataProvider(this);

}

}

现在,无论您在哪里必须使用提供者,都可以使用具体类型对其进行实例化。

new HelloDataProvider<YourImplementation>();

希望能帮助到你

于 2013-05-06T22:46:03.473 回答