Java:“使用未经检查或不安全的操作。重新编译......”

时间:2013-03-21 10:51:57

标签: java inner-classes instanceof comparable nested-generics

尽管花费了大量时间来搜索我的困境并重新阅读我的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.

我在这里的几乎所有组合或可比较的组合仍然会导致这样的弹出窗口。我正在使用BlueJ环境进行编程,这使得无法合并相关的编译器参数以查看任何细节。

就我迄今为止的研究而言,它与内部类利用I泛型类型的事实有关,因此“RedBlackNode实现Comparable”和RedBlackNode内部类中的compareTo方法需要以某种方式与这一事实抗衡。

我知道这个问题已经在stackoverflow和其他地方被问过并且多次回答,但我似乎无法将我从这些实例中学到的东西应用到我的案例中。我是Generics的新手,所以我能得到的任何帮助都会非常感激!

3 个答案:

答案 0 :(得分:2)

Comparable采用Type参数。编译器抱怨,因为你没有提供它。

答案 1 :(得分:2)

警告是因为您使用原始类型Comparable而不是为其提供类型参数。您所要做的就是将类定义更改为

public class RedBlackTree<I extends Comparable<I>>

private class RedBlackNode implements Comparable<RedBlackNode>

并相应地调整compareTo()方法(这实际上会大大简化它,因为您不再需要类型检查和转换)。

答案 2 :(得分: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