我有一个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>)"
有什么想法吗?是否有可能做我想做的事情。还有其他选择,例如手动将它们全部转换为通用类型,但它似乎是以通用方式处理事物的一个很好的用例。
答案 0 :(得分: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>();
希望有所帮助