我正在编写一个基于二叉树模型的泛型集合。
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
有人可以
- 确认我可以使用
@SuppressWarnings("unchecked")
安全地忽略警告, - 建议我如何安全地将
Object
投射到T
, - 解释为什么上述两点都不能满足,这样我就可以停止思考如何使这项工作 ?
多谢!
如果你想进行不受限制的搜索,你需要做一个演员表。您可以添加instanceof
来保护强制转换免受异常的影响,但这也不理想。
请考虑更改T
的边界,如下所示:
class MyTree <T extends Comparable<? super T>> extends AbstractCollection<T>{...}
由于您执行了覆盖,因此几乎需要抑制警告。演员表应如下所示:
@SuppressWarnings("unchecked")
Comparable<? super T> t = (Comparable<? super T>) o;
有关如何在 Java 源代码中完成的示例,请参阅getEntry
java.util.TreeMap
方法的源代码(他们这样做的原因相同 - 需要覆盖带有签名的方法Object
)。