当前位置: 首页 > 知识库问答 >
问题:

如何在Java中创建带有对象通配符(参数)的方法?

华化
2023-03-14
Problem<NQueensBoard, QueenAction> problem = new GeneralProblem<>(createBoard(),
TailoredNQF::getIFActions, TailoredNQF::getResult, TailoredNQF::testGoal);

SearchForActions<NQueensBoard, QueenAction> search = new BreadthFirstSearch<>(new GraphSearch<>());
Optional<List<QueenAction>> actions = search.findActions(problem);
actions.ifPresent(qActions -> qActions.forEach(System.out::println));
System.out.println(search.getMetrics());

在这里,我希望“BroadthFirstSearch”是某种通配符(*)(或方法结构中的参数),这样我就可以像;

runCode(BreadthFirstSearch);
runCode(DepthFirstSearch);
...

没有重复。我该怎么做?

共有1个答案

程磊
2023-03-14

您需要使用接口抽象依赖注入,来注入您想要执行的对象搜索类型。代码将如下所示:

public interface SearchForAction<N, Q> {
    Optional<List<Q>> findActions(Problem<N, Q> problem);
}

public class BreadthFirstSearch implements SearchForAction<N, Q> {
    Optional<List<Q>> findActions(Problem<N, Q> problem) {
        // Do your action
    }    
}

public class SearchEngine<N, Q> {
    
    private SearchForAction<N, Q> searchForAction;
    public Optional<List<Q>> runCode(SearchForAction<N, Q> searchForAction, Problem<N, Q> problem) {
        this.searchForAction = searchForAction;
        return this.searchForAction.findActions(problem);
    }
}

public class Program {

    private SearchEngine<NQueensBoard, QueenAction> searchEngine = new SearchEngine<>();
    private SearchForActions<NQueensBoard, QueenAction> breadthFirstSearch = new BreadthFirstSearch<>();
    private SearchForActions<NQueensBoard, QueenAction> depthFirstSearch = new DepthFirstSearch<>();

    // In your program call your method and you inject your dependency
    searchEngine.runCode(breadthFirstSearch);
    searchEngine.runCode(depthFirstSearch);
}
 类似资料:
  • 我试图创建一个由子类定义的对象数组(我认为这是正确的术语)。我可以看到这个问题反复出现,但实现仍然存在问题。 我的代码 给出错误 线程“main”java.lang.NullPointerException中出现异常。 为了使其合理化,我将其分解为最简单的术语: 这似乎奏效了。我只是看不出我的两个例子有什么不同。我知道我的第一个没有意义,但是MyClass最终会包含更多的数据。) 我很肯定这个问题

  • 本文向大家介绍如何在Java中创建String对象?,包括了如何在Java中创建String对象?的使用技巧和注意事项,需要的朋友参考一下 您可以通过以下方式创建字符串: 将包装在“”中的字符串值分配给String类型变量。 通过将字符串值作为其构造函数的参数传递,使用new关键字创建String类的对象。 将字符数组传递给String构造函数。

  • 问题内容: 我有以下方法: 我想使其成为一种通用方法,这样我就不必为每个新的自定义类型编写新的代码。我可以这样做,这需要在调用update()之前实例化该对象: 出于好奇,我想知道是否有一种方法可以使用Java泛型来做到这一点: 有没有办法用Java做到这一点? 问题答案: 请注意,在这种情况下将可以修复。任一(其本身包括可从获得)或本身已得到通过。

  • 问题内容: 在 Java中 ,是否可以覆盖使用创建的类中的方法?例如,说我有以下课程: 在一个类中,我想直接创建它并重写其方法,如下所示: 有没有办法以同样的方式使用反射来覆盖方法?也许是这样的吗?: 如果没有,是否还有其他方法可以这样做,或者可以使用外部库吗?我正在寻找将侦听器添加到setter方法以更改绑定值的方法。 问题答案: 不,用您的例子是不可能的。 在您的示例中,Java编译器将创建两

  • 有办法实现这样的事情吗?这段代码与我想要实现的类似。 这里的问题是BiConsumer,我需要通配符是hashmap通配符的超级。 短绒是这样说的 但是,在执行,表示它需要是一种类型。但该类型当前是通配符。

  • 我有一个自定义Java注释: