我会直接讲。以下是我正在AI应用程序中实现的用于解决单词难题的GeneralSearch类的代码段。我想知道如何在抽象类中实例化子类。我觉得我已经在我的BreadthFirstSearch类及其调用其超级构造函数的构造函数中实现了所有相关的抽象方法。 (嵌套子类)
我了解您无法实例化一个抽象类,但是根据以前的线程和信息,您可以使用抽象超类实例化一个子类。
我尝试以下电话无济于事:
GeneralSearch bfs = new BreadthFirstSearch(now.getState(),info); //正确的参数
要么。
GeneralSearch bfs = GeneralSearch.BreadthFirstSearch(now.getState(),info);
收到错误:
1)BreadthFirstSearch无法解析为类型
2)未为类型GeneralSearch定义方法BreadthFirstSearch(WordState,WordNodeInfo)
我似乎无法获得该子类的有效实例化,因此可以执行此类搜索。如果有人能阐明我的困惑和理解,那就太好了。 (下面的代码)
public abstract class GeneralSearch {
NodeInfo nodeInfo;
ArrayList unvisited, visited;
public GeneralSearch (State startState, NodeInfo nodeInfo) {
this.nodeInfo = nodeInfo;
unvisited = new ArrayList();
unvisited.add(new Node(startState, new Actions()));
visited = new ArrayList();
}
public Node search() {
Actions moves;
Action move;
//Iterating through arrayList for unvisited and possible arcs
Node visit, successor;
if(unvisited.isEmpty()) return null;
while( !unvisited.isEmpty() ) {
visit = select();
if(nodeInfo.isGoal(visit)) return visit;
moves = visit.getState().getActions();
Iterator<Action> it = moves.iterator();
while(it.hasNext()) {
successor = (Node) visit.clone();
move = it.next();
successor.getState().update(move);
insert(successor);
}
visited.add(visit);
}
return null;
}
public abstract Node select ();
public abstract void insert (Node node);
public class BreadthFirstSearch extends GeneralSearch {
public BreadthFirstSearch(State startState, NodeInfo nodeInfo) {
super(startState, nodeInfo);
}
public Node select() {
return (Node) visited.get(0);
}
public void insert(Node node) {
unvisited.add(node);
}
}
}
最佳答案
将BreadthFirstSearch类放在GeneralSearch类之外的单独文件中。
如果要保留它,请尝试实例化GeneralSearch.BreadthFirstSearch
而不是仅实例化BreadthFirstSearch
,但是我什至不确定自己的父级中是否可以有子类。
在第二次尝试中,您丢失了一条新语句:
GeneralSearch bfs = new GeneralSearch.BreadthFirstSearch(now.getState(), info);
关于java - 实例化抽象类的子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16099964/