如何在Java中创建通用列表?
我希望重新设计一下轮子,并在Java中创建类似于ArrayList的通用数组支持列表类。是的,我知道这很愚蠢,但这是一种学术追求。问题是不能实例化泛型类型的数组如何在Java中创建通用列表?,java,arrays,generics,arraylist,Java,Arrays,Generics,Arraylist,我希望重新设计一下轮子,并在Java中创建类似于ArrayList的通用数组支持列表类。是的,我知道这很愚蠢,但这是一种学术追求。问题是不能实例化泛型类型的数组 public class MySuperCoolList<E> { E[] array; public MySuperCoolList<E> () { array = new E[10]; // ERROR: cannot do this! } } 公共类MySuperCoolL
public class MySuperCoolList<E> {
E[] array;
public MySuperCoolList<E> () {
array = new E[10]; // ERROR: cannot do this!
}
}
公共类MySuperCoolList{
E[]阵列;
公共MySuperCoolList(){
array=new E[10];//错误:无法执行此操作!
}
}
这个问题肯定有解决方案,因为Java的ArrayList也在做同样的事情。问题是,怎么做?如何实例化泛型类型E
的数组?ArrayList是如何实现的(如果有人知道的话)
ArrayList是如何实现的(如果有人知道的话)
它是开源的。请看一下:
ArrayList是如何实现的(如果有人知道的话)
它是开源的。请看一下:
在这种情况下,您可能需要使用对象类型的数组,因为对象类型可以容纳所有内容,代码如下所示
public class MySuperCoolList<E> {
Object[] array;
public MySuperCoolList () {
array = new Object[10];
}
public E get(int index){
return (E) array[index];
}
public void put(int index,E val) {
array[index] = val;
}
}
公共类MySuperCoolList{
对象[]数组;
公共MySuperCoolList(){
数组=新对象[10];
}
公共E-get(int索引){
返回(E)数组[索引];
}
公开作废认沽权(整数索引,E值){
数组[索引]=val;
}
}
在这种情况下,您可能需要使用对象类型的数组,因为对象类型可以容纳所有内容,代码如下所示:
public class MySuperCoolList<E> {
Object[] array;
public MySuperCoolList () {
array = new Object[10];
}
public E get(int index){
return (E) array[index];
}
public void put(int index,E val) {
array[index] = val;
}
}
公共类MySuperCoolList{
对象[]数组;
公共MySuperCoolList(){
数组=新对象[10];
}
公共E-get(int索引){
返回(E)数组[索引];
}
公开作废认沽权(整数索引,E值){
数组[索引]=val;
}
}
如您所见,输出与预期一致:
[I@fb53f6
10
[500, 0, 0, 0, 0, 0, 0, 0, 0, 0]
如您所见,输出与预期一致:
[I@fb53f6
10
[500, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ArrayList
在内部将其元素保存在Object
s(Object[]
)的数组中。不可能(事先不知道类型)创建泛型数组。的可能副本您可能是C#背景吗?ArrayList
在内部将其元素保存在Object
s(Object[]
)的数组中。不可能(在事先不知道类型的情况下)创建泛型数组。可能的副本您可能是C#背景吗?哦,我不知道它是开源的。干得好!所以在泛型的下面是一堆铸造,嗯?好好玩。谢谢@mtmurdock-Java标准库源代码从第一天起就免费提供。早在Java开源之前,@mtmurdock是的,Java泛型就是这样的——编译时检查,然后是一系列转换。如果你想读更多的话,关键词是“擦除”。哦,我不知道它是开源的。干得好!所以在泛型的下面是一堆铸造,嗯?好好玩。谢谢@mtmurdock-Java标准库源代码从第一天起就免费提供。早在Java开源之前,@mtmurdock是的,Java泛型就是这样的——编译时检查,然后是一系列转换。如果你想读更多的话,关键字是“erasure”。问题是使用者必须将类作为参数传递,这是多余的。我正在尝试制作一个类似ArrayList的集合。冗余?我真的不这么认为。你不认为必须在构造函数中输入两次类是多余的吗?DRY,我的朋友,DRY。@mtmurdock使用工厂方法,让编译器推断泛型类型参数。您无法在运行时获取泛型类型的类,这意味着您仍必须在某个时候输入两次类信息。是的,您的解决方案是功能性的,但是您会注意到没有一个内置类是这样做的,即:ArrayList问题是使用者必须将该类作为参数传递,这是多余的。我正在尝试制作一个类似ArrayList的集合。冗余?我真的不这么认为。你不认为必须在构造函数中输入两次类是多余的吗?DRY,我的朋友,DRY。@mtmurdock使用工厂方法,让编译器推断泛型类型参数。您无法在运行时获取泛型类型的类,这意味着您仍必须在某个时候输入两次类信息。是的,您的解决方案是功能性的,但是您会注意到没有一个内置类是这样做的,即:ArrayList
[I@fb53f6
10
[500, 0, 0, 0, 0, 0, 0, 0, 0, 0]