2010-11-22 4 views
4

私はデータ構造コースを取っています。私たちはMark WeissのJava 2nd Editionのデータ構造とアルゴリズム解析を使用しています。彼のBinaryHeapの実装では、コンストラクタはAnyType []に​​キャストされるComparable []配列を作成します。新しいAnyType []を作成するのではなく、なぜ彼がこれを行うのか、あなたは何か考えていますか?データ構造(Weiss Java book):T []の代わりにBinaryHeap <T>配列にComparable []を割り当てる理由

私はBinaryHeapの構造を理解していますが、私はジェネリックスを高速化したいと考えています。クラス宣言は、AnyTypeがAnyTypeまたはAnyTypeの継承階層を上回る任意のスーパークラス(AnyTypeが型のサブクラスであり、機能するためにそのcompareToメソッドを変更する必要がない場合)。

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

完全なクラスソース

on his siteを見つけることができますが、ここで私はと心配部品です:

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

実行時に型情報が存在しないため、汎用型の配列を作成することはできません。 AnyTypeComparableに拡張されているので、それは使用できる唯一の「コンクリート」タイプです。

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

2

Javaは実行時にANYTYPE型が知られていないので、ジェネリックを実装するためにType Erasureを使用するため、はそれらの配列を作成することはできません。この他を見てくださいquestion

1

汎用タイプの消去のため、コンパイラはAnyTypeが何であるか分からず(したがって配列を作成できません)。しかし、我々はAnyTypeComparableを実装していることを知っているので、Comparablesの配列を作成するのが安全な解決策です。

関連する問題