1

これは、d-aryヒープのremoveメソッドです。コンパイルすると、多くの「変換不可能なタイプ」エラーが発生します。また、私のプログラムはComparableを拡張していることに注意してください。

public class HeapImpl12<T extends Comparable<? super T>> implements Heap12<T>

私の配列はオブジェクト型ではなくT型であることを知っています。

T[] _nodeArray = (T[]) new Comparable[DEFAULT_ARRAYSIZE]; 

質問:すべてがタイプTであるべきだと理解していますが、コードを書いているときに「タイプTをタイプINTに変換できません」というエラーがたくさん出たので、タイプキャストして同じタイプ(T)にすることにしました。 (整数)。「変換不能タイプ」エラーが発生するため、これを行うのが間違っていたことに気づきました。Java Genericsについて高い理解を持っている人は、タイプTのすべてを維持するためのテクニックとヒントを教えてください。

public void remove(T o) {
    for(int i = 0; i < _nodeArray.length; i++){
        if(_nodeArray[i].equals(o)){
            _nodeArray[i] = _nodeArray[_numNodes - 1];
            if((Integer)_nodeArray[i] > parentIdx(i)){
                bubbleUp((Integer)_nodeArray[i]);
            }
            else{
                trickleDown((Integer)_nodeArray[i]);
            }

        }
        else{
            throw new NoSuchElementException();
        }


        _numNodes--;
    }

}

エラー:型キャスト(整数)時に発生します。必要に応じてすべてのコードを投稿できますが、これで十分だと思います。

4

1 に答える 1

2

あなたは本当に多くのことをする必要はありません-それは実際にはそのままです。明示的なキャストを取り出して、次のcompareTo場所で使用するだけ>です。

public void remove(T o) {
    for(int i = 0; i < _nodeArray.length; i++){
        if(_nodeArray[i].equals(o)){
            _nodeArray[i] = _nodeArray[_numNodes - 1];
            if(_nodeArray[i].compareTo(parentIdx(i)) > 0){
                bubbleUp(_nodeArray[i]);
            }
            else{
                trickleDown(_nodeArray[i]);
            }

        }
        else{
            throw new NoSuchElementException();
        }


        _numNodes--;
    }
}
于 2011-08-29T22:47:27.523 に答える