Java:将一个子类转换为另一个子类?

标签 java

我正在尝试理解我在一篇研究论文中读到的内容,该论文建议您可以通过使用 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/

相关文章:

java - 在Java中查找相同的对象

java - Android 闹钟管理器设置在特定时间重复

java - 如何在 JavaFx Table 列标题中放置复选框

Javafx:ListView 禁用列表的指定元素

java - 工作服 GitHub 操作 - 错误 : Lcov file not found

java - 使用PreparedStatement时,Oracle在关闭结果集和语句后不会删除游标

java - JFrame DO_NOTHING_ON_CLOSE 不适用于 Command + Q

java - Android pdf maker 代码错误

java.lang.RuntimeException : Resource not found?

java - 缩放调度程序 Web 服务