使用泛型时无法解析方法

时间:2014-05-21 15:06:52

标签: java generics tree

我正试图为我的项目建立一棵树。

此树将包含一些移动后具有不同电路板状态的节点。

现在我的项目结构如下:

                               src
            Agent      Support              Test               Threes
        Tree.java      Some class.java      some class          Board.java

我希望我的树存储在src.Threes包中保存的这些Board对象。但是在我的Tree类中,它不允许我访问我的公共董事会方法。

我确信我只是错过了一些非常基本的东西,但是在花时间寻找我所缺少的东西后,我无法弄清楚这一点。

请参阅下面的Tree.java代码:

package src.Agent;


import java.util.ArrayList;
import src.Threes.Board; // unused import
import java.util.List;


public class Tree<Board> {

    private Node<Board> root;

public Tree(Board RootData){
    root = new Node<Board>(RootData);
    //root.data = RootData;
    //root.children = new ArrayList<Node<Board>>(); // maximum length of 4


}





public static class Node<Board>{
    private Board data;
    private Node<Board> parent;
    private List<Node<Board>> children;

    public Node(Board board){
        data = board;
        children = new ArrayList<Node<Board>>();

    }

    private boolean addChild(Board board){
        return !board.gameOver(); // Cannot resolve method gameOver() (public method in Board).
    }




}

public static void main(String[] args){

}

}

1 个答案:

答案 0 :(得分:1)

这是问题所在:

public static class Node<Board>

这声明了一个名为Node泛型类,而Board是一个类型参数。在Node中,标识符Board引用名为Board的类型参数,不是类型Board本身。

看起来你根本不想要它是通用的,所以你可以把它改成:

public static class Node {
    ...
}

每当您在其余代码中使用Node<Board>Node时,就会更改。

同样,我怀疑你不希望Tree是通用的。

如果你希望TreeNode是通用的,你应该这样声明:

public static class Node<T> {
    private T data;
    private Node<T> parent;
    private List<Node<T>> children;
    ...
}

...但是你不能在Board中引用Node - 特定成员。您可以将T限制为Board或子类型:

public static class Node<T extends Board> {
    private T data;
    private Node<T> parent;
    private List<Node<T>> children;
    ...
}

......此时你的gameOver等电话会起作用 - 但这可能是特定于董事会和通用的奇怪组合。我不希望NodeTree类有任何“游戏结束”的概念。分开你的担忧!