Java 将运行时之前未知的对象强制转换为其类型
我有一个包含三类节点的树。例如,根节点具有另一个节点类的左、右节点。这三个类都实现了一个接口。问题是在运行之前,我不知道left和right节点的类型,但我需要转换为特定类型,否则我无法访问节点的变量 那么,如何在运行时将这些节点强制转换为其类型呢Java 将运行时之前未知的对象强制转换为其类型,java,object,casting,Java,Object,Casting,我有一个包含三类节点的树。例如,根节点具有另一个节点类的左、右节点。这三个类都实现了一个接口。问题是在运行之前,我不知道left和right节点的类型,但我需要转换为特定类型,否则我无法访问节点的变量 那么,如何在运行时将这些节点强制转换为其类型呢 //node has a attribut left of type of interface Visitable public Visitable left; .... //Visitable is the Interface that the
//node has a attribut left of type of interface Visitable
public Visitable left;
....
//Visitable is the Interface that the three classes has implemented
(CLASS) leftNode = (CAST_TO_ITS_TYPE) node.left;
//I only can access isVisited, if leftNode is casted to its class
Boolean visited = leftNode.isVisited;
我尝试了“instanceof”,但这不起作用,因为leftNode可能尚未初始化
Visitable leftNode;
if (node.left instanceof NodeClassOne) {
leftNode = (NodeClassOne) node.left;
} else if (node.left instanceof NodeClassTwo) {
leftNode = (NodeClassTwo) node.left;
}
Boolean visited = leftNode.isVisited;
实际上你做得对
node.left
应为非空
,以正确定义其类型
Visitable leftNode = null;
if (node.left != null) {
if (node.left instanceof NodeClassOne)
leftNode = (NodeClassOne) node.left;
else if (node.left instanceof NodeClassTwo)
leftNode = (NodeClassTwo) node.left;
}
Boolean visited = leftNode != null ? leftNode.isVisited : Boolean.FALSE;
实际上你做得对
node.left
应为非空
,以正确定义其类型
Visitable leftNode = null;
if (node.left != null) {
if (node.left instanceof NodeClassOne)
leftNode = (NodeClassOne) node.left;
else if (node.left instanceof NodeClassTwo)
leftNode = (NodeClassTwo) node.left;
}
Boolean visited = leftNode != null ? leftNode.isVisited : Boolean.FALSE;
你为什么说
instanceof
不起作用?什么不起作用?null上的Instanceof将返回false。您的代码对我来说毫无意义。您说过需要强制转换才能访问字段,但强制转换变得无关紧要,因为变量类型将保持可访问状态,因此,无论您是否强制转换为NodeClassOne
或NodeClassTwo
。@Zack使用第二个代码IntelliJ告诉我leftNode可能尚未初始化。@Tom如果不强制转换,我会得到错误:无法解析符号“isVisited”为什么说instanceof
不起作用?什么不起作用?null上的Instanceof将返回false。您的代码对我来说毫无意义。您说过需要强制转换才能访问字段,但强制转换变得无关紧要,因为变量类型将保持可访问状态,因此,无论您是否强制转换为NodeClassOne
或NodeClassTwo
。@Zack使用第二个代码IntelliJ告诉我leftNode可能尚未初始化。@Tom如果没有强制转换,我会得到错误:无法解析符号“isVisited”,第3行的Null检查是不必要的。SomeClass的Null instanceof将返回false。不需要在第3行进行Null检查。SomeClass的Null instanceof将返回false。