Java 如何正确调用带有泛型类型参数的方法并摆脱;未选中对原始类型成员的调用";警告
我已经为我的列表的适配器的不同子类创建了一个基类,它有一个具有泛型类型的列表字段。课程代码如下:Java 如何正确调用带有泛型类型参数的方法并摆脱;未选中对原始类型成员的调用";警告,java,android,Java,Android,我已经为我的列表的适配器的不同子类创建了一个基类,它有一个具有泛型类型的列表字段。课程代码如下: public class ListBaseAdapter<T> extends BaseAdapter { private List<T> items; @Override public int getCount() { if (items==null) return 0; return ite
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;
}
}
在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);
}
}
代码工作正常,而且我知道,通过设置ListBaseAdapter的类型(如下面的示例),可以消除警告:
private ListBaseAdapter<Users> adapter;
私有ListBaseAdapter适配器;
但是如果我这样做,我必须在ListFragment中准备多个适配器,每个适配器都有一个特定的类型
我想知道是否有一种方法可以消除警告(不使用Lint),但仍然只保留一个适配器字段,或者我是否正确地使用了这种编码方式?对于您的示例,您还应该使用一个类型来初始化它们,即:
public class UserListAdapter extends ListBaseAdapter<Users> {...}
public class AddressListAdapter extends ListBaseAdapter<Address> {...}
公共类UserListAdapter扩展ListBaseAdapter{…}
公共类AddressListAdapter扩展ListBaseAdapter{…}
如果您只想维护一个引用,但仍然能够传入特定类型,那么根据您提供的代码,我建议您遵循以下几点:
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);
}
}
公共类ListFragment扩展了ListFragment{
//你真的不需要保留对这个的引用
//因为它可以用getListAdapter()检索
专用ListBaseAdapter适配器;
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
...
开关(类型){
案例1:
UserListAdapter userAdapter=新的UserListAdapter();
userAdapter.setDataset(用户);
适配器=用户适配器;
打破
案例2:
AddressListAdapter addressAdapter=新的AddressListAdapter();
addressAdapter.setDataset(地址);
适配器=地址适配器;
打破
}
setListAdapter(适配器);
}
}
如果您以后不需要向适配器分配数据,那么就可以了。您的字段仅属于类型
ListBaseAdapter
,但您的局部变量属于特定类型,因此您可以直接使用它们,然后将它们分配给类型更弱的字段adapter
。对于您的示例,您还应该使用类型初始化它们,即:
public class UserListAdapter extends ListBaseAdapter<Users> {...}
public class AddressListAdapter extends ListBaseAdapter<Address> {...}
公共类UserListAdapter扩展ListBaseAdapter{…}
公共类AddressListAdapter扩展ListBaseAdapter{…}
如果您只想维护一个引用,但仍然能够传入特定类型,那么根据您提供的代码,我建议您遵循以下几点:
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);
}
}
公共类ListFragment扩展了ListFragment{
//你真的不需要保留对这个的引用
//因为它可以用getListAdapter()检索
专用ListBaseAdapter适配器;
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
...
开关(类型){
案例1:
UserListAdapter userAdapter=新的UserListAdapter();
userAdapter.setDataset(用户);
适配器=用户适配器;
打破
案例2:
AddressListAdapter addressAdapter=新的AddressListAdapter();
addressAdapter.setDataset(地址);
适配器=地址适配器;
打破
}
setListAdapter(适配器);
}
}
如果您以后不需要向适配器分配数据,那么就可以了。您的字段仅属于类型
ListBaseAdapter
,但您的局部变量属于特定类型,因此您可以直接使用它们,然后将它们分配给类型更弱的字段adapter太好了,+1。。!作为安卓标签的顶级用户,你能回答这个简短的问题吗?我应该为每个类、文件或项目使用一个publicstaticvoidmain(){}
方法吗?太好了,+1。。!作为安卓标签的顶级用户,你能回答这个简短的问题吗?每个类、文件或项目是否应该有一个publicstaticvoidmain(){}
方法?