我正在实现一个通用BST,它不允许重复。我已经创建了一个Node
类,它具有以下定义:如何防止将另一个通用类型的节点或原始节点添加到BST?
class Node<T extends Comparable<T>> implements Comparable<Node<T>>{
private T value;
// other stuff
}
有了它我基本上要在一个具有某种节点相关联的值是与相同类型的其它值相媲美。然后我也有它里面以下compareTo
方法:
@Override
public int compareTo(Node<T> o) {
return value.compareTo(o.value);
}
现在,在我的BST的实施,我有一个关于接受的参数有问题。该BST具有以下定义:
public class BinaryTreeSet<T extends Comparable<T>> {
private Node<T> root;
// other stuff
}
正如你所看到的,我要求的一般类型的根是同一个通用类型的其他值,即T extends Comparable<T>
相媲美。这似乎一切OK,直到我add
方法,该方法具有以下签名的实现:
public void add(Node<T> n) {...}
似乎没有什么可疑的(至少对我来说),但如果我有以下代码:
BinaryTreeSet<String> t = new BinaryTreeSet<>();
t.add(new Node(12)); // Adding a raw Node (whose value is actually an integer)
它实际上编译,但它不应该,因为我实例String
的BinaryTreeSet
S,所以我不应该能够号添加到树。
什么我做错了,为什么?我怎样才能在这些情况下不编译?
至少,有一个警告。 – Tunaki
Java泛型不能处理rawtypes。永远不要使用rawtypes,你不会有这个问题。使用rawtypes并忽略所有的编译器警告,并没有什么编译器可以做些什么来帮助你 - 其实这就是为什么有rawtype编译器警告...... –
@BoristheSpider我绝不会使用原始类型,但也许这个类的客户会,这就是为什么我问是否有防止这种行为的一种方式... – nbro