在泛型集合

时间:2018-05-16 23:00:34

标签: java generics collections comparable

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

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")

有人可以吗

  1. 确认我可以使用Object
  2. 安全地忽略该警告
  3. 建议我如何安全地将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)))
  4. 解释为什么上述两点都不能满足,所以我可以不再考虑如何使这项工作?
  5. 非常感谢!

1 个答案:

答案 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)。