簡體   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