Приведите объект, который не известен до времени выполнения, к его типу. - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть дерево, которое содержит три класса узлов.Например, корневой узел имеет левый и правый узел другого класса узлов.Все три класса реализуют интерфейс.Проблема в том, что до времени выполнения я не знаю, какой тип имеет левый и правый узел, но мне нужно привести к конкретному типу, иначе я не могу получить доступ к переменным узлов.

Итак, как я могу привести эти узлы к его типу во время выполнения?

//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;

1 Ответ

0 голосов
/ 10 февраля 2019

На самом деле вы делаете это правильно.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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...