0

私がやろうとしていることは明らかだと思いますが、私はジェネリックの専門家ではありません.

import java.util.ArrayList;
public class MinHeap<E extends Comparable> extends ArrayList<E>  {
    /* A simple wrapper around a List to make it a binary min-heap. */
    public MinHeap() {
        super();
    }

    @Override
    public boolean add(E e) {
        super.add(e);
        int i = this.size() - 1;
        int parent;

        while (i > 0) {
            parent = this.getParentIndex(i);

            if (this.get(i).compareTo(this.get(parent)) < 0) {
                this.swap(i, parent);
            } else {
                break;
            }
        }
        return true;
    }

    public int getParentIndex(int i) {
        if (i % 2 == 1) {
            return (i - 1) / 2;
        } else {
            return (i - 2) / 2;
        }
    }

    private void swap(int i, int j) {
        E temp = this.get(i);
        this.set(i, this.get(j));
        this.set(j, temp);
    }
}

コンパイル時に警告が表示されます。

MinHeap.java:21: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type Comparable
            if (this.get(i).compareTo(this.get(parent)) < 0) {
                                 ^
  where T is a type-variable:
    T extends Object declared in interface Comparable
1 warning

わかりません。私は何が欠けていますか?

最初は、 this.get(i) と this.get(parent) が Comparable のインスタンスであることを確認する必要があると考えていたので、チェックを追加しました。

if (!(this.get(i) instanceof Comparable) ||
    !(this.get(parent) instanceof Comparable)) {
    return false;
}

しかし、それは同じ警告を出します。

4

1 に答える 1

4
public class MinHeap<E extends Comparable> extends ArrayList<E> 

する必要があります

public class MinHeap<E extends Comparable<E>> extends ArrayList<E> 

Comparableジェネリック インターフェイス自体であるためです。

于 2013-11-23T04:12:05.637 に答える