我正在编写一个基于二叉树模型的通用集合。
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
我想覆盖接口boolean contains(Object o)
的方法AbstractCollection<T>
,以便可以检查除Object
以外的T
类型的T
。
对于O(log n)中的树遍历,泛型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
投射到=IF(ISNA(MODE.MULT(MyData)),
IF(ISNA(MATCH(4,MyData,0)),Fruit,4),
IF(ROWS(MODE.MULT(MyData))<2,
IF(AND(COUNTIF(MyData,"<>"&MODE.MULT(MyData))=0,MODE.MULT(MyData)<>4),Fruit,MODE.MULT(MyData)),
IF(ISNA(MATCH(4,MODE.MULT(MyData),0)),Fruit,4)))
,非常感谢!
答案 0 :(得分:4)
如果您想进行无限制搜索,则需要进行投射。您可以添加instanceof
来保护来自异常的强制转换,但这也不理想。
考虑更改T
的界限,如下所示:
class MyTree <T extends Comparable<? super T>> extends AbstractCollection<T>{...}
由于您执行覆盖,因此非常需要禁止警告。演员表应如下所示:
@SuppressWarnings("unchecked")
Comparable<? super T> t = (Comparable<? super T>) o;
请参阅getEntry
的{{1}}方法的来源,了解它如何在Java source中完成(他们出于同样的原因这样做 - 需要使用签名java.util.TreeMap
)。