OptaPlanner泛型问题:约束Solution_继承SolutionBase后编译失败
解决方案
方法1:用泛型辅助方法安全转换
添加一个私有泛型方法来捕获具体的泛型类型,绕过编译器的严格校验报错:
private <S extends SolutionBase> DefaultSolverFactory<S> buildSolverFactory(String resourcePath) { // 此处强制转换安全,因为XML配置中定义的Solution类型必然是SolutionBase的子类 return (DefaultSolverFactory<S>) SolverFactory.createFromXmlResource(resourcePath); } // 在业务类中调用 DefaultSolverFactory<Solution_> solverFactory = buildSolverFactory("some string");
方法2:使用通配符兼容类型转换
如果业务代码仅用solverFactory执行创建Solver等只读操作,无需修改其泛型参数,可以改用通配符放宽类型约束:
DefaultSolverFactory<? extends Solution_> solverFactory = (DefaultSolverFactory<? extends Solution_>) SolverFactory.createFromXmlResource("some string");
原因说明
修改前CommonBusinessLayer<Solution_>是无边界泛型,编译器将Solution_视为Object,强制转换时不会做严格的泛型校验。但添加Solution_ extends SolutionBase的边界后,编译器要求转换的泛型类型必须严格匹配——而OptaPlanner的SolverFactory.createFromXmlResource返回的是SolverFactory<? extends Solution>(前提是SolutionBase已实现OptaPlanner核心的Solution接口),Java泛型不支持这种直接的协变强制转换,因此编译失败。
额外注意:SolutionBase必须实现OptaPlanner的Solution接口,否则框架无法将其识别为合法的规划解决方案类,这是功能正常运行的前提。
内容的提问来源于stack exchange,提问作者sudo
相关产品推荐
相关产品推荐

