1

重複の可能性:
Javaでジェネリック型のインスタンスを作成しますか?
Javaの方法:ジェネリック配列の作成

ジェネリック型のクラスを作成しようとしています。これは私のクラスファイルです。

public class TestClass<T> implements AbstractDataType<T>{

    T[] contents;

    public TestClass(int length) {
        this.contents = (T[])new Object[length];
    }
}

ただし、コンテンツには、から継承されたメソッドが含まれていObject classます。コンテンツの抽象配列を作成するにはどうすればよいですか?

4

4 に答える 4

6

初期化する限り、contentsあなたが持っているものがあなたができる最善のことだと思います。方法があれば、ArrayListおそらくそれを行います(行132: http: //www.docjar.com/html/api/java/util/ArrayList.java.html

しかし、「コンテンツにはObjectクラスから継承されたメソッドが含まれている」と言う場合、コードでTインスタンスを操作しているときなどのメソッドにしかアクセスできないことを意味していると思いtoStringます。equalsこれが主な問題です。Tこれは、インスタンスが何であるかについてコンパイラに何も伝えていないためです。特定のインターフェースまたはタイプからメソッドにアクセスする場合は、にタイプ制約を設定する必要がありますT

次に例を示します。

interface Foo {
  int getSomething();
  void setSomethingElse(String somethingElse);
}

public class TestClass<T extends Foo> implements AbstractDataType<T> {
  T[] contents;

  public TestClass(int length) {
    this.contents = (T[])new Object[length];
  }

  public void doSomethingInteresting(int index, String str) {
    T obj = contents[index];
    System.out.println(obj.getSomething());
    obj.setSomethingElse(str);
  }
}

これで、から継承されたメソッド以外のメソッドにアクセスできるようになりましたObject

于 2012-08-27T19:12:37.997 に答える
1

Javaでジェネリック配列を作成することはできません。Java言語仕様で述べられているように、前述のルールは、「上記のルールは、配列作成式の要素タイプが、無制限のワイルドカード以外のパラメーター化されたタイプであってはならないことを意味します」と述べています。

于 2012-08-27T19:09:18.737 に答える
0

どのように考えArrayList.toArray、それをArrays.copyOf行いますか?

を参照してくださいArray.newInstance

public TestClass(Class<T> type, int length) {
    this.contents = Array.newInstance(type, length);
}
于 2012-08-27T19:16:18.320 に答える
0

コンテンツにアクセスするメソッドでは、タイプとしてキャストする必要があると思いますT。これの主な理由は、オブジェクト配列として、Javaはコンテンツをオブジェクトと見なしてそれらを適合させることです。したがってcontents、の配列である可能性がありますが、Tそれでもタイプの配列にすぎませんObject

于 2012-08-27T19:09:46.873 に答える