使用确定的默认成员类型扩展 ArrayList [英] Extending ArrayList with determined default member type

查看:38
本文介绍了使用确定的默认成员类型扩展 ArrayList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Java 新手,所以我不知道这种技术叫什么,而且我可能不擅长解释事情,但我希望你能理解.

i am new at java, so i don't know what this technique called, and i may be poor at explain things, but i hpe you understand.

假设我有这两个类,Item,它可能会扩展到 ExtendedItem

Assume i have this two class, Item and it might be extended to ExtendedItem

public class Item { }

public class ExtendedItem extends Item {}

我想为它创建集合包装器,所以我创建了一个从 ArrayList 扩展的类...(场景 1)

i want to create collection wrapper for it, so i create a class extended from ArrayList... (Scenario 1)

public class DataSet extends ArrayList<Item> {}

然后初始化它

DataSet dataset1 = new DataSet();
DataSet<ExtendedItem> dataset2  = new DataSet<ExtendedItem >();

dataset1.get(0) // yield Item instance... which is in this case, correct
dataset2.get(0) // also yield Item instance

现在,当我定义具有泛型类型的 DataSet 时...(场景 2)

now, when i define DataSet with generic type... (Scenario 2)

public class DataSet<T extends Item> extends ArrayList<Item> {}

它产生了

DataSet dataset1 = new DataSet();
DataSet<ExtendedItem> dataset2  = new DataSet<ExtendedItem >();

dataset1.get(0) // yield Object instance.... dont't want this
dataset2.get(0) // yield ExtendedItem instance... correct

有没有办法(场景)使两个数据集都产生正确的类型,并将Item"作为默认类型?,就像这样:

is there any way (scenario) so both data set yield correct type with "Item" as the default type?, like this:

DataSet dataset1 = new DataSet();
DataSet<ExtendedItem> dataset2  = new DataSet<ExtendedItem >();

dataset1.get(0) // yield Item instance
dataset2.get(0) // yield ExtendedItem instance

--------------------------- 编辑 ---------------------------

我可能找到了解决方案:

I might found the solution:

public class DataSet<E extends Item> extends ArrayList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
    @Override
    public E get(int i) {
        return super.get(i);
    }

    @Override
    public int size() {
        return super.size();
    }
}

那个:

DataSet dataset1 = new DataSet();
DataSet<ExtendedItem> dataset2  = new DataSet<ExtendedItem >();

dataset1.get(0) // yield Item instance... correct
dataset2.get(0) // yield ExtendedItem instance... correct

推荐答案

不要使用原始类型.

改变

DataSet dataset1 = new DataSet();

DataSet<Item> dataset1 = new DataSet<Item>();

然后dataset1.get(0)会返回Item.

你也应该改变

public class DataSet<T extends Item> extends ArrayList<Item> {}

public class DataSet<T extends Item> extends ArrayList<T> {}

否则 dataset2.get(0) 也将返回 Item 而不是 ExtendedItem.

Otherwise dataset2.get(0) will also return Item instead of ExtendedItem.

这篇关于使用确定的默认成员类型扩展 ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆