Java 使用确定的默认成员类型扩展ArrayList
我是java新手,所以我不知道这种技术叫什么,我可能不擅长解释,但我希望你们能理解 假设我有两个类,Item,它可能被扩展到ExtendedItemJava 使用确定的默认成员类型扩展ArrayList,java,generics,arraylist,Java,Generics,Arraylist,我是java新手,所以我不知道这种技术叫什么,我可能不擅长解释,但我希望你们能理解 假设我有两个类,Item,它可能被扩展到ExtendedItem public class Item { } public class ExtendedItem extends Item {} 我想为它创建集合包装器,所以我创建了一个从ArrayList扩展的类。。。(情景1) 公共类数据集扩展了ArrayList{} 然后初始化它 DataSet dataset1 = new DataSet(); Dat
public class Item { }
public class ExtendedItem extends Item {}
我想为它创建集合包装器,所以我创建了一个从ArrayList扩展的类。。。(情景1)
公共类数据集扩展了ArrayList{}
然后初始化它
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 dataset1=新数据集();
DataSet dataset2=新数据集();
dataset1.get(0)//产生项实例。。。在这种情况下是这样的,对吗
dataset2.get(0)//也生成项实例
现在,当我用泛型类型定义数据集时。。。(情景2)
公共类数据集扩展了ArrayList{}
它屈服了
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
DataSet dataset1=新数据集();
DataSet dataset2=新数据集();
dataset1.get(0)//产生对象实例。。。。我不想要这个
dataset2.get(0)//产生ExtendedItem实例。。。对的
是否有任何方法(场景)使两个数据集都产生正确的类型,并将“Item”作为默认类型?如下所示:
DataSet dataset1 = new DataSet();
DataSet<ExtendedItem> dataset2 = new DataSet<ExtendedItem >();
dataset1.get(0) // yield Item instance
dataset2.get(0) // yield ExtendedItem instance
DataSet dataset1=新数据集();
DataSet dataset2=新数据集();
dataset1.get(0)//yield项实例
dataset2.get(0)//yield ExtendedItem实例
------------------------------------编辑-----------------
我可能会找到解决办法:
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();
}
}
公共类数据集扩展ArrayList实现列表、随机访问、可克隆、可序列化{
@凌驾
公共电子商务(int i){
返回super.get(i);
}
@凌驾
公共整数大小(){
返回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=新数据集();
DataSet dataset2=新数据集();
dataset1.get(0)//产生项实例。。。对的
dataset2.get(0)//产生ExtendedItem实例。。。对的
不要使用原始类型
改变
DataSet dataset1 = new DataSet();
到
到
公共类数据集扩展了ArrayList{}
否则,
dataset2.get(0)
也将返回Item
,而不是ExtendedItem
可能重复感谢您的回复,我最终找到了其他解决方案:)@1412请注意Eran的建议。您的解决方案可能看起来有效,但存在一些微妙的问题。谢谢您的建议,您能否详细说明可能出现的问题?用于教育目的
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>();
public class DataSet<T extends Item> extends ArrayList<Item> {}
public class DataSet<T extends Item> extends ArrayList<T> {}