使用确定的默认成员类型扩展ArrayList

时间:2016-11-07 13:36:25

标签: java generics arraylist

我是java的新手,所以我不知道这种技术叫什么,我可能很难解释事情,但我希望你理解。

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

public class Item { }

public class ExtendedItem extends Item {}

我想为它创建集合包装器,所以我创建了一个从ArrayList扩展的类......(场景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)

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”作为默认类型?,如下所示:

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

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

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

我可能会找到解决方案:

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

1 个答案:

答案 0 :(得分:2)

不要使用原始类型。

更改

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