Node
リンクリスト (実際には内部クラス)を使用してプライオリティ キューを実装する際に、以下のようにinsert()
andmax()
メソッドをコーディングしました。これは、アイテムを順序付けずに保持し、max()
ordeleteMax()
呼び出しが発生したときにのみ最大要素を検索するという遅延アプローチを使用します。
public class LinkedListMaxPQ<Item extends Comparable<Item>>{
private int N;
private Node head;
public void insert(Item item) {
Node old = head;
head = new Node();
head.item = item;
head.next = old;
N++;
}
public Item max() {
Item maxitem = (Item) this.head.item;
for(Node t=head.next;t!=null;t=t.next){
if(gt(t.item,maxitem)){
maxitem = (Item) t.item;
}
}
return maxitem;
}
private boolean gt(Comparable x,Comparable y){
return x.compareTo(y) > 0;
}
private class Node<Item extends Comparable<Item>>{
Item item;
Node next;
}
}
なぜキャストが必要なのか疑問に思っていItem maxitem = (Item) this.head.item
ます。クラスはジェネリック型Item which extends Comparable
を使用し、内部クラスも Item extends Comparable を使用するため、そのようなキャストは不要と思われます。
キャストを省略したら
Item maxitem = this.head.item;
コンパイラは、型の不一致があると文句を言います
タイプの不一致: Comparable から Item に変換できません
誰かがなぜこれが起こるのか説明できますか?