我正在尝试理解我在一篇研究论文中读到的内容,该论文建议您可以通过使用 RTTI 设施来提高 Java 中共享对象的性能。主要思想是,您有一个带有两个空子类的类,以指示主类中隐式“位”的状态。我正在查看的引用文献位于此处的论文中:http://cs.brown.edu/~mph/HellerHLMSS05/2005-OPODIS-Lazy.pdf在第 3 节:性能。
我正在尝试用我正在研究的数据结构复制这项技术。基本上我有:
class Node {
...
}
class ValidNode extends Node {}
class DeletedNode extends Node {}
然后我创建一个对象:
Node item = new ValidNode();
我想以某种方式将我的 ValidNode
实例转换为 DeletedNode
实例。我尝试过以下方法:
Node dnode = DeletedNode.class.cast( node );
和
Node dnode = (DeletedNode)node;
但是,两者都以 ClassCastException 终止。我必须假设我尝试做的是一种有效的技术,因为作者(他又将该技术集成到 Java1.6 库中)清楚地知道他在做什么。然而,我似乎没有足够的 Java 专家来弄清楚我在这里缺少什么。
我打算使用类似的东西
if ( node instanceof DeletedNode ) { // do stuff here
提前谢谢大家。
============ 编辑:
看起来以下方法可能有效:
class Node {
...
}
class ValidNode extends Node {}
然后,我创建(未删除的)类型为 ValidNode
的节点。当我希望将节点标记为已删除时,我会将节点沿链向上转换以键入 Node
。然后我可以使用 if (!(node instanceof ValidNode))
测试节点是否已被删除。
我会尝试一下。
最佳答案
事实是,Java 在编译时只知道您已将 item
声明为 Node
。然而,在运行时,JVM 知道对象的实际类。从那时起,从 Java 的角度来看,强制转换仅在继承链上才是合法的。即使这样,如果您没有给予足够的关注,也可能会失败(例如,构建为 Node 的对象不能转换为 DeletedNode)。由于继承的 Node 类型是同级类,因此沿继承链的强制转换将会失败,并会抛出众所周知的 ClassCastException。
关于Java:将一个子类转换为另一个子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370179/