我正在尝试编写三叉树的通用实现,该树的 addNode 方法调用父节点的 setLeft、setMiddle 和 setRight 方法,其定义如下:
public void setLeft(T item)
{
left = new TernaryTreeNode<T>(item);
}
在addNode方法中调用如下:
currentNode.setLeft(currentNode = new TernaryTreeNode<T>(data));
我没有包含完整的代码,因为如果我这样做,它不会让我发布问题,而 addNode 方法中的那一行就是错误所在。 VSC 告诉我,如果我使用 TernaryTreeNode 作为参数,则无法使用子 setter 方法,但这是为什么呢?我该如何修复它?
你的方法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
的列表s。同样你的setLeft
(和其他人)拿T
而不是TernaryTreeNode<T>
.
我是一名优秀的程序员,十分优秀!