在泛型集合中实现删除(对象 o)



我正在编写一个基于二叉树模型的泛型集合。

class MyTree <T extends Comparable<T>> extends AbstractCollection<T>{...}

基础Node<T>类(以及其他类)包含以下方法:

public Node<T> getLeft()  // left Node
public Node<T> getRight() // right Node
public T getValue()       // value stored in the Node

我想覆盖接口AbstractCollection<T>的方法boolean contains(Object o),以便有可能检查T以外的Object

对于 O(log n) 中的树遍历,泛型类型T必须实现Comparable<T>,因此它有方法compareTo(T t)

我的代码:

@Override
public boolean contains(Object o){
T t = (T) o; // produces warning (see below)
BSNode<T> currentNode = this.root;
while(currentNode != null){
if(currentNode.getValue().equals(o)) {return true;}
if(currentNode.getValue().compareTo(t) < 0)  {currentNode = currentNode.getRight();}
if(currentNode.getValue().compareTo(t) > 0)  {currentNode = currentNode.getLeft();}
}
return false;
}

问题是我不能只是Object o投给T t使用compareTo(T t)。从技术上讲,Object是可铸造的T,但由于T是泛型类型,我收到以下警告:

warning: [unchecked] unchecked cast
T t = (T) o;
^
required: T
found:    Object
where T is a type-variable:
T extends Comparable<T> declared in class MyTree

有人可以

  1. 确认我可以使用@SuppressWarnings("unchecked")安全地忽略警告,
  2. 建议我如何安全地将Object投射到T
  3. 解释为什么上述两点都不能满足,这样我就可以停止思考如何使这项工作

多谢!

如果你想进行不受限制的搜索,你需要做一个演员表。您可以添加instanceof来保护强制转换免受异常的影响,但这也不理想。

请考虑更改T的边界,如下所示:

class MyTree <T extends Comparable<? super T>> extends AbstractCollection<T>{...}

由于您执行了覆盖,因此几乎需要抑制警告。演员表应如下所示:

@SuppressWarnings("unchecked")
Comparable<? super T> t = (Comparable<? super T>) o;

有关如何在 Java 源代码中完成的示例,请参阅getEntryjava.util.TreeMap方法的源代码(他们这样做的原因相同 - 需要覆盖带有签名的方法Object)。

最新更新