Extending ArrayList with determined default member type

青春壹個敷衍的年華 提交于 2020-01-05 05:07:39

问题


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.

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

public class Item { }

public class ExtendedItem extends Item {}

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

public class DataSet extends ArrayList<Item> {}

then initialize it

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

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

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

it yielding

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

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

--------------------------- EDIT ---------------------------

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();
    }
}

with that:

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:


Don't use the raw type.

Change

DataSet dataset1 = new DataSet();

to

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

Then dataset1.get(0) will return Item.

You should also change

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

to

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

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



来源:https://stackoverflow.com/questions/40466553/extending-arraylist-with-determined-default-member-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!