[英]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.