Java有一个最奇怪的错误

时间:2013-04-16 17:38:25

标签: java arraylist binary-tree

当我运行以下代码时:

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)......但为什么?

2 个答案:

答案 0 :(得分:7)

问题是T 方法中的zTree (奇怪地与其封闭类同名 - 不要这样做)不是与T 中的zTree相同,因为该方法是通用的:

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

如果你使泛型,它应该没问题,因为现在方法中的T类型参数与方法中的T意味着相同正在打电话。

void zTree(BinaryTree<T> tree)

强烈建议使用开始遵循Java命名约定,肯定不创建任何与声明它们的类同名的方法

如果该方法意味着是构造函数,则应该删除返回类型:

zTree(BinaryTree<T> tree)

(并且仍然修复了班级名称。)

答案 1 :(得分:3)

当您说

时,您声明方法zTree是通用的
<T> void zTree(BinaryTree<T> tree)

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

zTree(BinaryTree<T> tree)

此外,传统上,Java类名称以大写字母开头,例如ZTree