【问题标题】:Cannot Resolve Method when using generics使用泛型时无法解析方法
【发布时间】:2014-05-21 15:06:52
【问题描述】:

我正在尝试为我的项目实现一棵树。

这棵树将包含一些移动后不同棋盘状态的节点。

现在我的项目结构如下:

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

我希望我的树将这些 Board 对象存储在包 src.Threes 中。但是在我的 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){

}

}

【问题讨论】:

    标签: java generics tree


    【解决方案1】:

    这就是问题所在:

    public static class Node<Board>
    

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

    看起来您根本不希望它是通用的,因此您可以将其更改为:

    public static class Node {
        ...
    }
    

    然后在其余代码中每次使用 Node&lt;Board&gt; 时更改为 Node

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

    如果你确实希望TreeNode 是通用的,你应该像这样声明它们:

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

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

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

    ... 那时您的 gameOver 等调用将起作用 - 但这将是一个奇怪的组合,既是特定于董事会的又是通用的。我不希望 NodeTree 类有任何“游戏结束”的概念。分开你的顾虑!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多