我有一棵包含三类节点的树。例如,根节点具有另一个节点类的左节点和右节点。所有这三个类都实现一个接口。问题是在运行时之前,我不知道左节点和右节点具有哪种类型,但是我需要转换为特定类型,否则无法访问节点的变量。
那么如何在运行时将这些节点转换为它的类型?
//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”,但由于左节点可能尚未初始化,因此无法正常工作。
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
应该是not null
才能正确定义其类型。
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;