-1

当我运行以下代码时:

class zTree<T>
{
    ArrayList<ArrayList<T>> table = new ArrayList<ArrayList<T>>();
    int height = 0;

    <T> void zTree(BinaryTree<T> tree)
    {
        recIt((BinaryTree<T>)tree, 1);
    }

    void recIt(BinaryTree<T> tree, int fromRoot)
    {
        if(!(tree.isEmpty()))
        {
            ArrayList<T> tempList = (ArrayList<T>)table.get(fromRoot);
            tempList.add((T)tree.getData()); // add data to table
            recIt(tree.left,fromRoot+1); // recursive left,
            recIt(tree.right,fromRoot+1); // right
        }
        else
        {
            height = fromRoot-1;
        }
    }
}

Javac 返回此错误。

zTree.java:15: recIt(structures.tree.BinaryTree<T>,int) in zTree<T> cannot be applied to (structures.tree.BinaryTree<T>,int)
        recIt((BinaryTree<T>)tree, 1);
        ^
1 error

我不关心我的代码的效率。我很想知道出了什么问题,但是 javac 显然没有太大帮助,因为它告诉我 (x,y) 不能应用于 (x,y) ...但是为什么呢?

4

2 回答 2

7

问题是TinzTree 方法(奇怪地与它的封闭类具有相同的名称 - 不要那样做)与Tin the zTree class不同,因为该方法是通用的:

<T> void zTree(BinaryTree<T> tree)

如果你让它不是通用的,它应该没问题,因为现在方法中的类型参数将与你正在调用的方法中的T含义相同。T

void zTree(BinaryTree<T> tree)

强烈建议 use 开始遵循 Java 命名约定,并且绝对不要创建与声明它们的类同名的任何方法。

如果该方法是一个构造函数,你应该去掉返回类型:

zTree(BinaryTree<T> tree)

(并且仍然修复类名。)

于 2013-04-16T17:40:57.933 回答
3

当您说时,您声明了zTree通用方法

<T> void zTree(BinaryTree<T> tree)

我怀疑你想创建一个构造函数。如果是这样,请不要使用返回类型。但是,您已经将您的类声明为泛型;只需使用您的班级T

zTree(BinaryTree<T> tree)

此外,按照惯例,Java 类名以大写字母开头,例如ZTree.

于 2013-04-16T17:41:16.623 回答