加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用ArrayAdapters的泛型

发布时间:2020-12-15 00:37:00 所属栏目:Java 来源:网络整理
导读:我在尝试创建通用ArrayAdapter时遇到了问题.这可能与我对 Java中的泛型有限的理解有关,并且希望有人可以让我直截了当.基本上我有一个抽象的基本适配器类: public abstract class BaseAdapterT extends ArrayAdapterT{ .... private ListT items; .... prote
我在尝试创建通用ArrayAdapter时遇到了问题.这可能与我对 Java中的泛型有限的理解有关,并且希望有人可以让我直截了当.基本上我有一个抽象的基本适配器类:
public abstract class BaseAdapter<T> extends ArrayAdapter<T>
{
    ....
    private List<T> items;
    ....
    protected abstract List<T> build(JSONArray jsonArray);
    ....
    @Override
    public T getItem(int position)
    {
        return items.get(position);
    }
    ....
}

然后我有一个扩展此基类的适配器:

public class MyAdapter extends BaseAdapter<BaseModel>
{
    ....
    @Override
    protected List<BaseModel> build(JSONArray jsonArray)
    {
        if (useBaseModel())
        {
            return BaseModel.buildBaseModels(jsonArray); //returns List<BaseModel>
        }
        else
        {
            return SubclassModel.buildSubclassModels(jsonArray); //returns List<SubclassModel>
        }
    }
    ....
}

模型定义为:

public class BaseModel{...}

public class SubclassModel extends BaseModel{....}

这不会编译,因为即使SubclassModel扩展了BaseModel,它们的列表也不相同.这个帖子(Most efficient way to cast List<SubClass> to List<BaseClass>)解释了这一点,并说使用它代替:

List<? extends BaseModel>

当我改为:

public class MyAdapter extends BaseAdapter<? extends BaseModel> 
{
    ...
    protected List<? extends BaseModel> build(JSONArray jsonArray)
    ...
 }

构建方法上的错误消失了,但现在有一个类级错误说明:
BaseAdapter中的getItem(int)与android.widget.ArrayAdapter中的getItem(int)冲突;尝试使用不兼容的返回类型.

似乎getItem应该返回一个类型?扩展BaseModel,它是谁 – 任何人都可以提供建议吗?

谢谢!

解决方法

嗯,我的Java SDK甚至不让我编译
public class MyAdapter extends BaseAdapter<? extends BaseModel>

它期望扩展后的无界类或接口.但这没关系,如果这是一个选项,问题的解决方案是更改BaseAdapter类:

public abstract class BaseAdapter<T> extends ArrayAdapter<T>
{
    ....
    private List<T> items;
    ....
    protected abstract List<? extends T> build(JSONArray jsonArray);
    ....
    @Override
    public T getItem(int position)
    {
        return items.get(position);
    }
}

然后

public class MyAdapter extends BaseAdapter<BaseModel> 
{
    ...
    protected List<? extends BaseModel> build(JSONArray jsonArray)
    ...
}

与以前的代码一起工作.

编辑:

忘了解释为什么你的第一个解决方案不起作用:

Language Spec说

Subtyping does not extend through generic types: T <: U does not imply that C <: C.

这意味着虽然SubclassModel扩展了BaseModel,但这并不意味着List扩展了List.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读