【发布时间】:2015-02-01 23:58:25
【问题描述】:
我的 Android 应用中有一个适配器,我想将其设为通用。
适配器基本上是这样的:
public class myAdapter extends FragmentStatePagerAdapter {
DataTypaA myFragment;
DataTypeB data;
DataTypeC items;
public myAdapter(FragmentManager fm, DataTypaA fragment) {
data = new SparseArray<DataTypeB>();
myFragment = fragment;
items = myFragment.getData();
}
public DataTypeB getItem(int position) {
return data.get(position);
}
@Override
public int getCount() {
return items.getList().size();
}
public void setData () {
items = myFragment.getItems () //getItems return DataTypeC
data.setTheData (items)
}
}
我把它改成了通用的
public class myAdapter <A,B,C> extends FragmentStatePagerAdapter {
A myFragment;
B data;
C items;
public myAdapter(FragmentManager fm, A fragment) {
data = new SparseArray<B>();
myFragment = fragment;
items = (C) myFragment.getData();
}
public B getItem(int position) {
return data.get(position);
}
@Override
public int getCount() {
return items.getList().size();
}
public void setData () {
items = myFragment.getItems () //getItems return DataTypeC
data.setTheData (items)
}
}
但是我得到了不同的错误,当方法应该得到 DataTypeC 参数并且我传递它的参数类型 C ( data.setTheData (items) )实际上是类型 DataTypeC 编译器建议将 C 转换为类型DataTypeC。在getCount() 中,我也有错误建议将items 转换为DataTypeC。
例如,当我尝试覆盖 getItem 时会出错,但是当我使用其他名称创建相同的方法时,它会编译。
//Error - "The return type is incompatible with FragmentStatePagerAdapter.getItem(int)"
@Override
public B getItem(int position) {
return (B) data.get(position);
}
//compiles
public B getItemTest(int position) {
return data.get(position);
}
任何想法如何解决它,使其 100% 通用?
添加:在您回答后,我将其更改为支持返回泛型类型:
public class TypeA <T> {
private T mData;
public T getData() { return mData;; }
}
public class myAdapter <A,B,C> extends FragmentStatePagerAdapter {
A myFragment;
B data;
C items;
public myAdapter(FragmentManager fm, A fragment) {
data = new SparseArray<B>();
myFragment = fragment;
items = myFragment.getData(); //Error - The method getData() is undefined for the type T
}
}
我收到编译错误...
当我运行它时,当然<T> 和<C> 是同一类型。
【问题讨论】:
-
为什么要让它通用?你能提供一个用例吗?目前尚不清楚您要达到的目标(或至少对我而言;)):
data的类型为DataTypeB或SparseArray<DataTypeB>? -
@Matthieu
data是B类型,这是一个错误,谢谢...这个适配器有一些逻辑,我想把它的使用交给其他类,他们只是需要设置类型<A,B,C>,而不是复制代码和创建新的适配器。 -
Alex,你应该在发布之前确保你的代码有意义。您的非泛型代码根本无法编译,因此很难提出任何明智的建议。