Почему методы addNode () возвращают ошибку компиляции «Метод ... в типе ... не применим для аргументов ...», и как я могу это исправить? - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь закодировать обобщенную реализацию троичного дерева *, и метод дерева addNode вызывает методы setLeft, setMiddle и setRight родительского узла, которые определены следующим образом:

public void setLeft(T item)
    {
        left = new TernaryTreeNode<T>(item);
    }

, который вызывается в методе addNode следующим образом:

currentNode.setLeft(currentNode = new TernaryTreeNode<T>(data));

Я не включаю весь код, потому что он не позволит мне опубликовать вопрос, если я это сделаю, и эту строку в Метод addNode - это ошибка. VS C говорит мне, что я не могу использовать методы дочернего сеттера, если я использую TernaryTreeNode в качестве аргумента, но почему это так? Как мне это исправить?

1 Ответ

0 голосов
/ 05 марта 2020

Ваши методы setLeft, setMiddle и setRight принимают Объект типа T в качестве аргумента, как вы заявили. Вы, однако, пытаетесь передать TernaryTreeNode<T> в качестве аргумента. Возможно, вам придется либо создать методы, которые принимают TernaryTreeNode<T> в качестве параметра, либо передать объект T, содержащийся в узле, в качестве аргумента. Трудно решить, что является правильным, основываясь на информации, которую вы предоставили, но один из них, скорее всего, неправильный подход. Решить, оба ли они неправы, еще сложнее. ;)

currentNode.setLeft(currentNode = new TernaryTreeNode<T>(data));

Приведенная выше строка передает объект TernaryTreeNode<T> вместо объекта T.

В качестве более точного сравнения точек вы пытаетесь сделать сродни на это:

Вы определяете:

public void thisMethodTakesT(T item) { ...

Но вы звоните:

thisMethodTakesT(new ArrayList<T>()); // This will produce a compile time exception.

thisMethodTakesT не принимает списки, требуется один элемент типа T, а не список T с. Точно так же ваш setLeft (и другие) принимает T, а не TernaryTreeNode<T>.

...