泛型和向下转换(java)
在过去的3个小时里,我一直在试图找到一个直截了当的答案/解决方案,但运气不佳,希望你们能提供帮助: 我有以下几个类,它们使用二进制搜索树实现了一个区间树:泛型和向下转换(java),java,generics,classcastexception,Java,Generics,Classcastexception,在过去的3个小时里,我一直在试图找到一个直截了当的答案/解决方案,但运气不佳,希望你们能提供帮助: 我有以下几个类,它们使用二进制搜索树实现了一个区间树: public class Node<T extends Comparable<T>> implements Comparable<Node<T>> {...} public class BinarySearchTree<T extends Comparable<T>>
public class Node<T extends Comparable<T>> implements Comparable<Node<T>> {...}
public class BinarySearchTree<T extends Comparable<T>> {
protected Node<T> root;
...}
public class IntervalNode extends Node<Interval> {...}
public class IntervalTree extends BinarySearchTree<Interval> {...}
public类节点实现可比较的{…}
公共类二进制搜索树{
受保护的节点根;
...}
公共类IntervalNode扩展节点{…}
公共类IntervalTree扩展了BinarySearchTree{…}
当我尝试对IntervalTree实例的根成员执行以下强制转换时,我得到一个ClassCastException:
IntervalNode CurrentNode = (IntervalNode)root; //root being of type Node<Interval>
which IntervalNode extends.
IntervalNode CurrentNode=(IntervalNode)根目录//属于Node类型的根
哪个间隔节点扩展。
我对java相当陌生,但从我阅读和谷歌搜索的内容来看,这种降级应该是可能的,所以我对这种异常的原因有点不知所措。到目前为止,我最好的猜测是,这是由类型擦除引起的,但我还没有找到关于这个问题的直接答案。关于此异常的原因或更好的解决方法,您有什么想法吗?您在这里不是向上投射,而是向下投射。IntervalNode是
节点
(因为它扩展了它),但节点
不一定是IntervalNode
正如香蕉之所以是水果是因为它延伸了它,但水果并不总是香蕉。如果你有一个水果,并把它扔到一个香蕉上,只有当水果实际上是一个香蕉时,它才会起作用。如果它是一个苹果,它会失败。你不是在向上投射,而是向下投射。IntervalNode是
节点
(因为它扩展了它),但节点
不一定是IntervalNode
正如香蕉之所以是水果是因为它延伸了它,但水果并不总是香蕉。如果你有一个水果,并把它扔到一个香蕉上,只有当水果实际上是一个香蕉时,它才会起作用。如果它是一个苹果,它将失败。如果您的
IntervalTree
中需要IntervalNode
,那么:
public class BinarySearchTree<T extends Node<?>> {
protected T root;
}
public class IntervalTree extends BinarySearchTree<IntervalNode> {
}
公共类二进制搜索树如果在IntervalTree
中需要IntervalNode
,那么:
public class BinarySearchTree<T extends Node<?>> {
protected T root;
}
public class IntervalTree extends BinarySearchTree<IntervalNode> {
}
公共类BinarySearchTree如果您将节点
作为一个接口(并可能将公共实现放在基类中),那么您几乎可以完全完成您最初尝试做的事情:
公共接口节点扩展了{…}
公共类BaseNode实现节点{…}
公共类IntervalNode扩展BaseNode实现节点{…}
只要使所有节点sIntervalTree
使用IntervalNode
的实例,一切都应该正常工作
无论是哪种方式(有接口还是没有接口),您都需要确保覆盖BinarySearchTree
中创建IntervalTree
s中IntervalNode
s的任何内容,以创建IntervalNode
s。如果您将Node
作为接口(并可能将公共实现放在基类中),你几乎完全可以做你一开始想做的事情:
公共接口节点扩展了{…}
公共类BaseNode实现节点{…}
公共类IntervalNode扩展BaseNode实现节点{…}
只要使所有节点sIntervalTree
使用IntervalNode
的实例,一切都应该正常工作
无论哪种方式(有或没有接口),您都需要确保覆盖BinarySearchTree
中创建IntervalTree
s中的IntervalNode
s的任何内容,以便从您的代码中创建IntervalNode
s.,每个IntervalNode
都是节点
,但是节点
可能是IntervalNode
(不是每个节点)。当您在树中插入一个项时,它将是一个节点
可能执行类似的操作,如果(root==null)root=new Node()
如果是这样,则您的类型转换将始终无效。从您的代码中,每个IntervalNode
都是节点
,但节点
可能是IntervalNode
(不是每个)。当您在树中插入一个项时,它将是一个节点
可能执行类似的操作,如果(root==null)root=new Node()代码>如果是这样,那么你的类型转换总是无效的。是的,我刚刚意识到我应该说向下转换我会编辑问题,谢谢你的提醒。是的,我刚刚意识到我应该说向下转换我会编辑问题,谢谢你的提醒。