Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用确定的默认成员类型扩展ArrayList_Java_Generics_Arraylist - Fatal编程技术网

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

Java 使用确定的默认成员类型扩展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

我是java新手,所以我不知道这种技术叫什么,我可能不擅长解释,但我希望你们能理解

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

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> {}