在泛型集合中实现 remove(Object o)
Implement remove(Object o) in generic collection
我正在编写一个基于二叉树模型的通用集合。
class MyTree <T extends Comparable<T>> extends AbstractCollection<T>{...}
基础Node<T>
class(以及其他)包含以下方法:
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)
以便能够检查 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;
}
问题是我不能为了使用 compareTo(T t)
而将 Object o
转换为 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.util.TreeMap
的 getEntry
方法的来源,了解如何在 Java source 中完成的示例(他们这样做的原因相同 - 需要重写方法签名为 Object
).
我正在编写一个基于二叉树模型的通用集合。
class MyTree <T extends Comparable<T>> extends AbstractCollection<T>{...}
基础Node<T>
class(以及其他)包含以下方法:
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)
以便能够检查 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;
}
问题是我不能为了使用 compareTo(T t)
而将 Object o
转换为 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.util.TreeMap
的 getEntry
方法的来源,了解如何在 Java source 中完成的示例(他们这样做的原因相同 - 需要重写方法签名为 Object
).