[英]How to correctly call a method with parameter of generic type and get rid of the “unchecked call to member of raw type” warning
我为列表的适配器的不同子类创建了一个基类,它具有具有通用类型的List字段。 该类的代码如下:
public class ListBaseAdapter<T> extends BaseAdapter {
private List<T> items;
@Override
public int getCount() {
if (items==null)
return 0;
return items.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
List getDataset() {
return items;
}
public void setDataset(List<T> items) {
this.items = items;
}
}
另外,以下是其不同子类的一些示例:
public class UserListAdapter extends ListBaseAdapter {...}
public class AddressListAdapter extends ListBaseAdapter {...}
在ListFragment中,将根据显示的不同列表类型声明和初始化ListBaseAdapter字段。
public class TheListFragment extends ListFragment {
private ListBaseAdapter adapter;
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
...
switch(type) {
case 1:
adapter = new UserListAdapter();
adapter.setDataset(users); // this line of code is getting the warning of "unchecked call to member of raw type"
break;
case 2:
adapter = new AddressListAdapter();
adapter.setDataset(addresses); // this line of code is getting the warning of "unchecked call to member of raw type"
break;
}
setListAdapter(adapter);
}
}
代码运行良好,我也知道通过将Type设置为ListBaseAdapter,例如下面的示例,可以摆脱警告:
private ListBaseAdapter<Users> adapter;
但是,如果这样做,我将必须在ListFragment中准备多个适配器,每个适配器都有特定的类型。
我想知道是否有一种摆脱警告的方法(不使用Lint),但仍然仅维护一个适配器字段,或者我是否正确地进行了这种编码?
对于您的示例案例,还应该使用一种类型来初始化它们,即:
public class UserListAdapter extends ListBaseAdapter<Users> {...}
public class AddressListAdapter extends ListBaseAdapter<Address> {...}
如果您只想维护一个引用,但仍然能够传递特定的类型,那么根据您提供的代码,我建议遵循以下内容:
public class TheListFragment extends ListFragment {
// You really don't even need to keep a reference to this
// since it can be retrieved with getListAdapter()
private ListBaseAdapter<?> adapter;
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
...
switch(type) {
case 1:
UserListAdapter userAdapter = new UserListAdapter();
userAdapter.setDataset(users);
adapter = userAdapter;
break;
case 2:
AddressListAdapter addressAdapter = new AddressListAdapter();
addressAdapter.setDataset(addresses);
adapter = addressAdapter;
break;
}
setListAdapter(adapter);
}
}
只要您不需要将来为适配器分配数据,就可以解决问题。 您的字段仅是ListBaseAdapter<?>
类型的,但是您的局部变量是特定类型的,因此您可以直接使用它们,然后将它们分配给类型更弱的字段adapter
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.