0

私はホイールを少し再発明し、ArrayList に似た Java で独自の汎用配列に基づくリスト クラスを作成しようとしています。はい、これがばかげていることはわかっていますが、それは学術的な追求です。問題は、ジェネリック型の配列をインスタンス化できないことです

public class MySuperCoolList<E> {
   E[] array;

   public MySuperCoolList<E> () {
      array = new E[10]; // ERROR: cannot do this!
   }
}

Java の ArrayList が同じことを行っているため、この問題には必ず解決策があるはずです。問題は、どうやって?ジェネリック型の配列をインスタンス化するにはどうすればよいEですか? そして、それは ArrayList でどのように行われますか (誰かが知っている場合)?

4

3 に答える 3

4

そして、それは ArrayList でどのように行われますか (誰かが知っている場合)?

オープンソースです。のソースコードをArrayList見てみましょう:

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;
于 2012-08-27T23:05:38.977 に答える
0

この場合、オブジェクト タイプの配列を使用することをお勧めします。オブジェクト タイプはすべてに対応できるため、コードは次のようになります。

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

}
于 2012-08-27T23:06:39.530 に答える
0
public MySuperCoolList<E>(final Class<? extends E> type) {
  array = (E[]) Arrays.newInstance(type, 10);
}

を参照してくださいArrays.newInstance。これが仕組みArrays.copyOfです。

ここに PoC を配置しました。

int[] vals = (int[]) Array.newInstance(Integer.TYPE, 10);
vals[0] = 500;
System.out.println(vals);
System.out.println(vals.length);
System.out.println(Arrays.toString(vals));

ご覧のとおり、出力は期待どおりです。

[I@fb53f6
10
[500, 0, 0, 0, 0, 0, 0, 0, 0, 0]
于 2012-08-27T23:12:02.260 に答える