代码之家  ›  专栏  ›  技术社区  ›  Niklas Mertsch

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

  •  4
  • Niklas Mertsch  · 技术社区  · 7 年前

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

    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 .

    对于O(logn)中的树遍历,泛型类型 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 供使用 比较(T) .从技术上来说 对象 这些都是可以铸造的 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. 建议我如何安全施放 对象 T ,
    3. 解释为什么上面的两个要点都不能满足,这样我就可以停止思考如何使这项工作?

    谢谢!

    1 回复  |  直到 7 年前
        1
  •  4
  •   Sergey Kalinichenko    7 年前

    如果你想进行不受限制的搜索,你需要做一个演员阵容。你可以加上 instanceof 保护演员免受例外,但这也不理想。

    考虑更改 T 详情如下:

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

    由于您执行了覆盖,因此基本上需要抑制警告。演员阵容应如下所示:

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

    见来源 getEntry 方法 java.util.TreeMap 例如,如何在 Java source (他们这样做的原因是一样的——需要用签名覆盖一个方法。) Object ).