Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型和向下转换(java)_Java_Generics_Classcastexception - Fatal编程技术网

泛型和向下转换(java)

泛型和向下转换(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>>

在过去的3个小时里,我一直在试图找到一个直截了当的答案/解决方案,但运气不佳,希望你们能提供帮助:

我有以下几个类,它们使用二进制搜索树实现了一个区间树:

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实现节点{…}
只要使所有
节点
s
IntervalTree
使用
IntervalNode
的实例,一切都应该正常工作


无论是哪种方式(有接口还是没有接口),您都需要确保覆盖
BinarySearchTree
中创建
IntervalTree
s中
IntervalNode
s的任何内容,以创建
IntervalNode
s。如果您将
Node
作为接口(并可能将公共实现放在基类中),你几乎完全可以做你一开始想做的事情:

公共接口节点扩展了{…}
公共类BaseNode实现节点{…}
公共类IntervalNode扩展BaseNode实现节点{…}
只要使所有
节点
s
IntervalTree
使用
IntervalNode
的实例,一切都应该正常工作


无论哪种方式(有或没有接口),您都需要确保覆盖
BinarySearchTree
中创建
IntervalTree
s中的
IntervalNode
s的任何内容,以便从您的代码中创建
IntervalNode
s.

,每个
IntervalNode
都是
节点
,但是
节点
可能是
IntervalNode
(不是每个节点)。当您在树中插入一个项时,它将是一个
节点
可能执行类似
的操作,如果(root==null)root=new Node()
如果是这样,则您的类型转换将始终无效。从您的代码中,每个
IntervalNode
都是
节点
,但
节点
可能是
IntervalNode
(不是每个)。当您在树中插入一个项时,它将是一个
节点
可能执行类似
的操作,如果(root==null)root=new Node()如果是这样,那么你的类型转换总是无效的。是的,我刚刚意识到我应该说向下转换我会编辑问题,谢谢你的提醒。是的,我刚刚意识到我应该说向下转换我会编辑问题,谢谢你的提醒。