5

次のようなジェネリックを使用してリンクされたコレクションを実装しようとしています。

public class A<E> {

  private class B {

    private B[] b;
    private E item;

    private B() {
      this.b = new B[2];
    }

  } // end inner class B

} // end class A

A はコレクションであり、B はコレクション内の要素またはノードであり、配列は後続/先行およびアイテムを参照します。

アレイの作成は許可されていません。私が得るエラーはですgeneric array creation。実際に作成しているのはの配列であると考えるのは正しいA<E>.Bですか?

そうでない場合、エラーの原因は何ですか?

もしそうなら、どうすればこれを回避できますか?

私が提供したものが十分でない場合は、私に知らせてください。アドバイスをいただければ幸いです。ありがとうございました。

編集 1:Aパラメータ化された型はinと同じでなければならないことを言及しておくべきでしたB。したがって<E>、内部クラスに渡すことはできません。作成E#2して終了AするためE#1です。

4

3 に答える 3

4

Bジェネリックは静的ではないため、外側のクラスからジェネリックを継承します。また、静的にすることもできません。必要になるからですE

つまり、コードを静的な内部クラスに変更する場合 (を使用する場合)、B.b配列には実際にジェネリックな型が必要になります。A<E>.BA.B<E>private static class B<E>

Java では、ジェネリックが (消去によって) 実装される方法のために、配列の型は明確に定義されていません。一方では の配列である必要があり、B他方では の配列である必要がありObjectます。

最も実行可能な解決策は、Object[]明示的に使用してキャストすることです。型安全性を高めたい場合はArrayList<B>、内部で を使用する ももちろん使用できObject[]ます。

特定のコードでB b1, b2;は、実際には高速で (境界チェックなし)、必要なメモリが少ない (配列オブジェクトなし、サイズ情報なし) オプションである可能性もあります。

于 2012-05-20T08:20:28.677 に答える
2

B非静的内部クラスです。つまり、外側のクラスのインスタンスへの参照があることを意味します。したがって、外部クラスの型パラメーターによって暗黙的にパラメーター化されます。だから、あなたが書くときB、それは意味しA<E>.Bます。配列を作成するには、raw クラスを使用する必要があります。ただし、B生のクラスではありません。生のクラスを参照するには、明示的に修飾する必要があります。A.B

だから、これはあなたが望むことです:

this.b = new A.B[2];
于 2012-05-21T18:02:39.367 に答える
-2

Eを内部クラスにも渡す必要があります

 private class B<E> {

            private B[] b;
            private E item;

            private B() {
                this.b = new B[2];
            }

        } // end inner class B
于 2012-05-20T08:00:08.343 に答える