2017-05-18 12 views
0
public class ArrayHeap<T extends Comparable<T>> implements Heap<T>{ 
... 

public ArrayHeap(int capacity){ 
     heap = (T[]) new Comparable[capacity]; 
    } 

こんにちはを作成するには、単にラインヒープ上の簡単な質問を持っている= ... だからクラスでは、我々は(ジェネリック型を使用してヒープを議論し、それらは、配列を使用して実装されています)。ただ、いくつかの見直しを行うと、実際の行にここで何が起こっているかの周りに私の頭を取得することはできません5.ジェネリック医薬品と同等のオブジェクト(Java)の存在

だから我々は、ジェネリック型のオブジェクトを作成することはできません、通常は私が見に期待:

heap = (T[]) new Object[capacity]

すなわちこれを読んでいたら、新しいObjectをタイプTのジェネリック配列にキャストした結果にヒープを設定し、サイズをcapacityに設定します。

heap = (T[]) new Comparable[capacity]; 

読み取ること:

私の質問は、ラインができるか、でしょうか?新しいComparableオブジェクトまたは同等のインタフェースを実装する新しいObjectを作成していますか?

答えて

1

new Comparable[N]は、ComparableまたはComparableの任意のサブタイプを保持できるN要素の配列を作成します。 Comparableが作成され、単なる配列になります。

キャストの場合、通常(String[]) new Comparable[N]のようなものを作成した場合、有効なキャストではないため、ClassCastExceptionが表示されます。ただし、T[]へのキャストはチェックされていません。つまり、キャスト式がある特定のポイントでは発生しません。その代わり、the cast is erasedとどこかは、あなたのArrayHeapクラスの外に、このようないくつかのコードがあります:

ArrayHeap<String> h = ...; 
String s = h.get(...); 

が、それはこのようなもので、コンパイル時に置き換えられます:

ArrayHeap h = ...; 
String s = (String) h.get(...); 

従って、我々はそれがだと言うことができます(T[])のような種類のキャストが移動されます。

(T[]) new Comparable[N]を実行すると、実際にはT[]が得られないということです。あなたは、ちょうどArrayHeapクラスの本体の中で、より良い静的型チェックを与えるためにコンパイラを騙すのに似ています。 Comparable[]T[]として外部に返そうとした場合、例外が発生します。

1

それはComparableオブジェクトを保持できる配列を作成です。重要な点は、アレイがComparableオブジェクトを保持することができのみであるということです。 new Object[capacity]は何かを保持することが許されます。

本当にがしたいことはT[]である - 意味は、配列は、ヒープがで作業することになっていることだけで、特定のタイプTを保持に制限されている - しかし、それは不可能ですので、Javaのジェネリックがどのように動作するかの(type erasure) 。 TComparableを実装する必要がありますので、次善の策はComparableの配列です。

これは、しかし、まだぎこちないです、そしてあなたは、生タイプとしてComparableの使用に関するコンパイラからの警告を取得します。heapList<T>と定義し、new ArrayList<>(capacity)で初期化する方が良いでしょう。