4

私はデータ構造コースを受講しており、Mark Weiss による Java 2nd Edition のデータ構造とアルゴリズム分析を使用しています。彼の BinaryHeap 実装では、彼のコンストラクターは、AnyType[] にキャストされる Comparable[] 配列を作成します。彼が単に新しい AnyType[] を作成するのではなく、なぜこれを行うのかについて何か考えはありますか?

BinaryHeap の構造は理解していますが、ジェネリックについては理解を深めたいと思っています。クラス宣言は単純明快です。AnyType が、AnyType に相当する型または AnyType の継承階層を上るスーパークラスを拡張することを確認してください (AnyType が型のサブクラスであり、機能するためにその compareTo メソッドを変更する必要がない場合)。 )。

しかし、行 ,array = (AnyType[]) new Comparable[ capacity + 1 ];は私には意味がありません。AnyType はすでに Comparable ではありませんか? 書くだけでどんな影響がありarray = new AnyType[ capacity + 1 ];ますか?

完全なクラスのソースは彼のサイトにありますが、私が懸念している部分は次のとおりです。

public class BinaryHeap<AnyType extends Comparable<? super AnyType>>
{
    private int currentSize;      // Number of elements in heap
    private AnyType [ ] array; // The heap array

    /**
     * Construct the binary heap.
     * @param capacity the capacity of the binary heap.
     */
    public BinaryHeap( int capacity )
    {
        currentSize = 0;
        array = (AnyType[]) new Comparable[ capacity + 1 ];
    }
4

3 に答える 3

4

実行時に型情報が存在しないため、ジェネリック型の配列を作成できません。AnyTypeextendsとして、これComparableが使用できる唯一の「具体的な」型です。

へのキャストAnyType[]は、間違いがあった場合にコンパイル時に警告が表示されるようにするためのものです。そのキャストは、結果のバイトコード命令には存在しません。同様に、arrayクラス変数はComparable[]、結果のバイトコードでは a になります。

于 2010-11-22T20:39:57.080 に答える
2

Javaは型消去を使用してジェネリックスを実装しているため、実行時に型AnyTypeは不明であるため、それらの配列を作成することはできません。この他の質問を見てください。

于 2010-11-22T20:39:03.353 に答える
1

ジェネリック型の消去のため、コンパイラは何が何でAnyTypeあるかを認識していません (したがって、その配列を作成できません)。しかし、私たちはAnyTypeimplementsを知っているComparableので、 Comparables の配列を作成することは安全な解決策です。

于 2010-11-22T20:41:43.737 に答える