1

Java コードをコンパイルしようとすると、説明できないエラーが発生します。

error: constructor MinimaxThread in class MinimaxThread cannot be applied to given types;
        MinimaxThread mmt = new MinimaxThread(board.clone(), 2, true);
                            ^
  required: no arguments
  found: MCBoard,int,boolean
  reason: actual and formal argument lists differ in length

MCBoard、int、およびブール値を取るコンストラクターがあるため、エラーは意味がありません。

public class MinimaxThread implements Runnable {
    public MCBoard board;
    public int depth;
    public HashMap<Tuple, Integer> moveEvals;
    boolean cont = true;
    boolean verbose = false;

    public MinimaxThread(MCBoard board, int initialDepth, boolean verbose) {
        this.board = board;
        depth = initialDepth;
        moveEvals = new HashMap<Tuple, Integer>();
        for (Tuple t : board.legalMoves) {
            moveEvals.put(t, new Integer(0));
        }
        this.verbose = verbose;
    }

これはオーバーロードされたコンストラクターです (MCBoard のみのコンストラクターと、MCBoard と int のコンストラクターがあります) が、それがどのように重要なのかわかりません。何か案は?呼び出しコードは次のとおりです。

public static void testMinimax(){
    MCBoard board = new MCBoard();
    board.move(5,0);
    board.move(4,0);
    board.move(5,2);
    MinimaxThread mmt = new MinimaxThread(board.clone(), 2, true);
    mmt.run();
}

編集:board.clone()オーバーライドされます:

public MCBoard clone() {
    // irrelevant code removed
    return new MCBoard(gridClone, turn, legalMovesClone, moveListClone);
}

編集#2:再現性のために、これが私のgitリポジトリです: https://github.com/cowpig/MagneticCave

4

1 に答える 1

7

編集: github URL を提供していただいたので、MinimaxThread実際にどのように見えるかを確認できます - 少なくとも最新のプッシュされたコードでは:

public class MinimaxThread extends Thread {
    public MCBoard board;
    public int depth;

}

うん、コンパイラーがそのコンストラクター呼び出しで文句を言う理由がわかります...

編集:それがオーバーライドされたことを知る前にMCBoard.clone()、以下の答えは理にかなっています。しかし今では、コンパイラが文句を言う理由がわかりません。実際、あなたが与えたコードを使用すると(ただし、実際の実装は無視されますが、これは無関係です)、すべて正常にコンパイルされます。

MinimaxThread.java:

public class MinimaxThread implements Runnable {
    public MinimaxThread(MCBoard board, int initialDepth, boolean verbose) {
    }

    public void run() {
    }
}

MCBoard.java:

public class MCBoard {
    public MCBoard clone() {
        return null;
    }
}

テスト.java:

public class Test {
    public static void main(String[] args) throws Exception {
        MCBoard board = new MCBoard();
        MinimaxThread mmt = new MinimaxThread(board.clone(), 2, true);
    }
}

したがって、提示したコードをビルドしていないと思われます。上記のコードをビルドしてみてください。それが機能する場合は、実際のコードとの違いを理解できるかどうかを確認してください。

元の答え

board.clone()おそらく、コンパイラは が を返すと「考え」ます。Objectそれが によって宣言されているからObject.clone()です。MCBoardしたがって、結果を次のようにキャストする必要があります。

MinimaxThread mmt = new MinimaxThread((MCBoard) board.clone(), 2, true);

または、ではなくを返すことを宣言して、clone()内でオーバーライドすることもできます。MCBoardMCBoardObject

于 2012-11-20T18:02:02.137 に答える