-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

私は自分のコードの効率を気にしません。私は何がうまくいかないのかを理解したいと思っていますが、(x,y) は (x,y) に適用できないと言っているので、javac は明らかに一度はあまり役に立ちません...しかし、なぜですか?

4

2 に答える 2

7

問題は、メソッドT内のzTree メソッド(奇妙なことに、それを囲むクラスと同じ名前を持っています。そうしないでください) はTzTree クラス内のメソッドと同じではないことです。これは、メソッドがジェネリックであるためです。

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

メソッド内の型パラメーターは、呼び出しているメソッド内の型パラメーターと同じ意味になるため、ジェネリックでなくても問題ありません。TT

void zTree(BinaryTree<T> tree)

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 に答える