繁体   English   中英

如何正确地调用具有泛型类型的参数的方法并摆脱“未经检查的原始类型成员的调用”警告

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM