gpt4 book ai didi

java - 在泛型集合中实现 remove(Object o)

转载 作者:搜寻专家 更新时间:2023-11-01 02:36:19 26 4
gpt4 key购买 nike

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

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(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 oT 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. 建议我如何安全地转换 ObjectT ,
  3. 解释为什么以上两点都无法满足,这样我就可以停止思考如何完成这项工作?

非常感谢!

最佳答案

如果您想要不受限制的搜索,您需要进行强制转换。您可以添加 instanceof 来防止异常转换,但这也不理想。

考虑如下更改 T 的边界:

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

由于您进行了覆盖,因此非常需要抑制警告。类型转换应如下所示:

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

请参阅 java.util.TreeMapgetEntry 方法的源代码以获取如何在 Java source 中完成的示例(他们这样做是出于同样的原因——需要覆盖一个带有 Object 签名的方法)。

关于java - 在泛型集合中实现 remove(Object o),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com