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 和 boolean:

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);

Alternatively, you could override clone() within MCBoard, declaring that it returns MCBoard rather than Object.

于 2012-11-20T18:02:02.137 回答