用确定的默认成员类型扩展ArrayList [英] Extending ArrayList with determined default member type
问题描述
我是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实例...在这种情况下,正确的
dataset2.get(0)//也产生Item实例
现在,当我使用泛型类型定义DataSet时(方案2)
public class DataSet< T extends Item>扩展ArrayList< Item> {}
收益
DataSet dataset1 = new DataSet();
DataSet< ExtendedItem> dataset2 = new DataSet< ExtendedItem>();
dataset1.get(0)// yield对象实例....不要这个
dataset2.get(0)//生成ExtendedItem实例...正确
是否有任何方法(场景),因此两个数据集都会生成正确的类型,其中Item为默认类型?像这样:
DataSet dataset1 = new DataSet();
DataSet< ExtendedItem> dataset2 = new DataSet< ExtendedItem>();
dataset1.get(0)// yield Item实例
dataset2.get(0)// yield ExtendedItem实例
---------------------------编辑------ ---------------------
我可能会找到解决方案:
public class DataSet< E extends Item>扩展ArrayList< E>实现List< E> ;, RandomAccess,Cloneable,Serializable {
@Override
public E get(int i){
return super.get(i);
}
@Override
public int size(){
return super.size();
$ / code $ / pre
:
DataSet dataset1 = new DataSet();
DataSet< ExtendedItem> dataset2 = new DataSet< ExtendedItem>();
dataset1.get(0)// yield Item实例...正确
dataset2.get(0)//生成ExtendedItem实例...正确
$ c
$ b 解决方案不要使用原始类型。
更改
DataSet dataset1 = new DataSet();
至
数据集<项目> dataset1 = new DataSet< Item>();
然后 dataset1.get(0)
will返回项目
。
您还应该更改
public class DataSet< T extends Item>扩展ArrayList< Item> {}
到
public class DataSet< T extends Item>扩展ArrayList< T> {}
否则 dataset2.get(0)
也会返回 Item
而不是 ExtendedItem
。
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
解决方案 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
.
这篇关于用确定的默认成员类型扩展ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!