未经检查的调用“比较”(T)'

时间:2014-11-21 16:34:01

标签: java generics

我正在尝试实现二进制搜索树,只是为了学习,我希望树是通用的。这是我到目前为止的代码(非常有限):

package lect1;

public class BinNode {
    Comparable element;
    BinNode left;
    BinNode right;

    public BinNode find(Comparable obj) {
        if (element == null) {
            return null;
        } else if (obj.compareTo(left.element) < 0) {
            left.find(obj);
        } else if(obj.compareTo(right.element) > 0) {
            right.find(obj);
        } else {
            return this;
        }
        return null;
    }

    public void insert(Comparable obj) {

    }
}

但是,我收到错误消息Unchecked调用'compareTo(T)'作为原始类型'java.lang.Comparable'的成员。你们中的任何人都可以解释一下如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

Comparable<T>是一种通用类型,但您使用的是 raw 类型,从而失去了类型安全性。您可能希望在其元素类型中使BinNode泛型:

public class BinNode<T extends Comparable<T>> {
    private T element;
    private BinNode<T> left;
    private BinNode<T> right;

    public BinNode<T> find(T obj) {
        // TODO: Handle the cases where left or right is null
        if (element == null) {
            return null;
        } else if (obj.compareTo(left.element) < 0) {
            return left.find(obj);
        } else if (obj.compareTo(right.element) > 0) {
            return right.find(obj);
        } else {
            return this;
        }
    }

    public void insert(T obj) {

    }
}

T上的约束确保元素可以相互比较。

请注意,我还修复了您的递归 - 之前您正在调用left.find()right.find(),但忽略了返回值。