Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确调用带有泛型类型参数的方法并摆脱;未选中对原始类型成员的调用";警告_Java_Android - Fatal编程技术网

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(){}
方法?