如何在Java中创建通用列表?

如何在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

我希望重新设计一下轮子,并在Java中创建类似于ArrayList的通用数组支持列表类。是的,我知道这很愚蠢,但这是一种学术追求。问题是不能实例化泛型类型的数组

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]