1

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 に変換できません

誰かがなぜこれが起こるのか説明できますか?

4

4 に答える 4

2

Javaはクラス宣言Itemで型パラメーターとして扱っているためです( で宣言された型パラメーターとは関係ありません)。NodeItemLinkedListMaxPQ<Item extends Comparable<Item>>

この宣言 -

private class Node<Item extends Comparable<Item>>{
    Item item;
    Node next;
}

は、 という型パラメータを持ち、Itemのサブタイプであるプライベート クラスを作成していることをコンパイラに伝えますComparable<Item>。型の消去中にItem、これは型である境界に置き換えられComparableます。そのため、明示的なキャストが必要です。

また、次の行 -

private Node head;

Node利用可能な型情報なしで生の type を作成します。この行について警告が表示されるはずです。

これを解決するには、次のように宣言しますhead-

private Node<Item> head;

次の方法でインスタンスを作成します-

head = new Node<Item>();  // if you are using jdk 6 or lesser
head = new Node<>();  // if you are using jdk 7

同様の方法ですべての参照を更新するNodeと、警告が表示されなくなります。

型パラメーターのバインドについてさらに明確にする必要がある場合は、型パラメーターのバインドがどのように機能するかを説明しようとした私のブログ投稿の 1 つを読むことができます。

于 2013-08-21T12:59:32.547 に答える
1

あなたが必要

private class Node{
...

次のようにします。

private class Node<Item extends Comparable<Item>>{

同じ名前を持っていても、囲んでいるクラスの型と同じではないという新しいジェネリック型を作成しています。ItemItem

于 2013-08-21T13:00:49.930 に答える
0

@JonathanDrapeau が指摘したように、答えは簡単です。t変数の宣言を次のように変更しNode<Item>ます。

    for (Node<Item> t = head.next; t != null; t = t.next){
        if (gt(t.item, maxitem)){
        maxitem = t.item;
        }
    }

2 番目のオプション: 親クラスNodeと同じ型を参照する場合は、クラス定義から型引数を削除します。LinkedListMaxPQ

public class LinkedListMaxPQ<Item extends Comparable<Item>> {

    ...

    private class Node {
        Item item;
        Node next;
    }
}
于 2013-08-21T13:22:42.153 に答える
0

頭を作成するときにタイプを指定しなかったので、node.headにはタイプオブジェクトがあります

これで問題が解決するはずです

public class LinkedListMaxPQ<Item extends Comparable<Item>>{
    private int N;
    private Node<Item> head;

   public void insert(Item item) {
       Node<Item> old = head;
       head = new Node<Item>();
       head.item = item;
       head.next = old;
       N++;
    }

    public Item max() {
        Item maxitem =  this.head.item;
        for(Node<Item> t=head.next;t!=null;t=t.next){
            if(gt(t.item,maxitem)){
            maxitem =  t.item;
            }
        }
        return maxitem;
    }



   private class Node<Item extends Comparable<Item>>{
      Item item;
      Node<Item> next;
   }

}
于 2013-08-21T13:07:37.813 に答える