返回泛型通配符集合时出现不兼容的类型错误

时间:2016-03-10 05:30:34

标签: java android generics

我正在研究一个生成从数据库中获取的两级关联数组的函数。该数组将用于创建可扩展列表视图。它必须是泛型通配符List,因为可扩展列表适配器需要。{/ p>

我刚刚从another thread读取,为了向通用集合添加元素,必须使用superextend与泛型。它工作正常,但是,为什么我在返回集合时遇到不兼容的类型错误?

public HashMap<String, List<? super SearchField>> getAll() {

    HashMap<String, List<SearchField>> listCollection = new HashMap<String,List<SearchField>>();

    /************DataBase Query***************/    
    try {

        if (cursor.moveToFirst()) {

            List rowList = new ArrayList<SearchField>();

            do {

                SearchField sf = new SearchField();

                sf.value = cursor.getString(cursor.getColumnIndex("value"));

                sf.group_title = cursor.getString(cursor.getColumnIndex("group_title"));

                sf.key = cursor.getString(cursor.getColumnIndex("key"))

                rowList.add(sf);

                Map<String,String> group = (Map<String,String>)listCollection.get(sf.group_title);

                if(group == null){

                    listCollection.put(sf.group_title,rowList);

                }else{

                    listCollection.get(sf.group_title).add(sf);

                }


            } while(cursor.moveToNext());
        }
    } catch (Exception e) {
    } finally {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
    }
    return listCollection;
           ^^^^^^^^^^^^^
}

SearchField类

public class SearchField {

    public String value;

    public String key;

    public String group_title;


}

我从另一个帖子中跟随了这个例子:

  public List<? extends Foo> getFoos()
  {
    List<Foo> foos = new ArrayList<Foo>(); /* Or List<SubFoo> */
    foos.add(new SubFoo());
    return foos;
  }

我试图从获取的结果创建的两级数组在PHP中是这样的:

$group = array("A Group"=>array("value"=>2,"title"=>"Apple"),
               "B Group"=>array("value"=>1,"title"=>"Boy")
         )

更新

我想返回通配符的原因是因为我的可扩展列表适配器用于不同的活动并采用不同结构的集合。

public ExpandableListAdapter(FragmentActivity context, List<String> group,
        Map<String, List<?>> listCollection) {
    this.dataCollections = listCollection;
}

所以我想使用通配符为适配器返回一个列表。

2 个答案:

答案 0 :(得分:1)

我认为问题在于你定义rowList的方式。试试这个:

List<SearchField> rowList = new ArrayList<SearchField>();

而不是

List rowList = new ArrayList<SearchField>();

答案 1 :(得分:0)

您是否尝试在函数声明中使用List<? extends SearchField>