1

私の苦境への答えを探してかなりの時間を費やし、Java教科書のジェネリックスの章を読み直したにもかかわらず、次のコードの問題を修正できないようです。

public class RedBlackTree<I extends Comparable>
{
    private int count = 0;
    private RedBlackNode root;

    private RedBlackNode current;
    private RedBlackNode[] stack;

    /**
     * Inner class used for representing the nodes of the red-black balanced binary search tree object.
     */
    private class RedBlackNode implements Comparable
    {
        private I id;
        private boolean is_btree;
        private RedBlackNode[] links;

        /**
         * Constructor for objects of the RedBlackNode class.
         * 
         * @param id The ID of the node.
         */
        private RedBlackNode(I id)
        {
            if (id == null)
            {
                throw new NullPointerException("ID cannot be null.");
            }

            this.id = id;
            this.is_btree = true;
        }

        /**
         * Function for comparing the RedBlackNode object to another object.
         * 
         * @param obj The object to be compared.
         * @return If invocant > passed, returns 1; if invocant < passed, returns -1; if invocant = passed, returns 0.
         */
        private int compareTo(Object obj)
        {
            if (obj instanceof RedBlackTree.RedBlackNode)
            {
                RedBlackNode node = (RedBlackNode)obj;

                int result = id.compareTo(node.id);

                return result > 0 ? 1 : result < 0 ? -1 : 0;
            }
            else
            {
                throw new ClassCastException("Expected a RedBlackNode object.");
            }
        }
    }
}

特に、次のメッセージを含むポップアップが表示されます。

Warnings from last compilation

C:\Users\...\RedBlackTree.java uses unchecked or unsafe operations.
Recompile with -Xlint:unchecked for details.

ここにあるIまたはComparableのほぼすべての組み合わせは、依然としてそのようなポップアップにつながります。私はプログラミングにBlueJ環境を使用していますが、これにより、詳細を表示するために関連するコンパイラー引数を組み込むことができなくなります。

これまでの調査からわかる限り、これは内部クラスがIジェネリック型を利用しているため、「RedBlackNodeはComparableを実装している」という事実と関係があり、RedBlackNode内部クラスのcompareToメソッドはそれに対処する必要があります。どういうわけか事実。

この質問はstackoverflowやその他の場所で何度も質問され、何度も回答されていることは知っていますが、これらのインスタンスから学んだことを自分のケースに適用することはできないようです。私はジェネリックスにかなり慣れていないので、ここで私が得ることができるどんな助けも非常にありがたいです!

4

3 に答える 3

2

次の変更を行います

public class RedBlackTree<I extends Comparable<I>>

private class RedBlackNode implements Comparable<RedBlackNode>

    @Override
    public int compareTo(RedBlackNode node)
            int result = id.compareTo(node.id);
            return result > 0 ? 1 : result < 0 ? -1 : 0;

compareToでタイプチェックを削除します。一般の人々に注意してください。したがって、常にを使用して@Overrideください。

于 2013-03-21T11:08:21.563 に答える
2

ComparableはTypeパラメーターを取ります。あなたがそれを提供しなかったので、コンパイラは文句を言います。

于 2013-03-21T10:55:31.740 に答える
2

Comparable警告は、typeパラメーターを指定する代わりにraw型を使用しているためです。クラス定義を次のように変更するだけです。

public class RedBlackTree<I extends Comparable<I>>

private class RedBlackNode implements Comparable<RedBlackNode>

それに応じてメソッドを調整しcompareTo()ます(これにより、型のチェックとキャストが不要になるため、実際にはかなり単純化されます)。

于 2013-03-21T11:01:48.437 に答える