Scala调用OptaPlanner带count收集器的groupBy方法编译失败求助
问题原因与解决方案
核心原因
你遇到的问题本质是Scala与Java泛型系统的兼容性差异,加上对count()收集器泛型参数的误用:
- OptaPlanner的约束流API基于Java实现,Scala编译器对Java泛型方法的类型推断能力有限,在多参数重载方法场景下容易出现匹配失败。
- 你错误地将
count()的泛型指定为ClassB,但UniConstraintCollector的第一个泛型参数必须是分组操作的源类型(即ClassA),而非分组键类型(ClassB),这直接导致了类型不匹配。
具体解决方案
方案1:修正count()的泛型参数
将count[ClassB]()改为count[ClassA](),确保收集器的类型与源数据流匹配:
factory .forEach(classOf[ClassA]) .filter(classA => classA.classB != null) .groupBy( (classA: ClassA) => classA.classB, count[ClassA]() ) // 后续约束操作
方案2:显式指定groupBy的泛型参数
如果Scala编译器仍无法自动推断类型,可以显式声明groupBy的泛型参数,强制匹配分组键类型和收集器结果类型:
factory .forEach(classOf[ClassA]) .filter(classA => classA.classB != null) .groupBy[ClassB, _, Integer]( (classA: ClassA) => classA.classB, count[ClassA]() ) // 后续约束操作
方案3:显式转换为Java函数接口
由于OptaPlanner的groupBy期望接收Java的Function接口而非Scala函数类型,可通过scala.jdk.FunctionConverters将Scala lambda转换为Java标准接口:
import scala.jdk.FunctionConverters._ factory .forEach(classOf[ClassA]) .filter(classA => classA.classB != null) .groupBy( ((a: ClassA) => a.classB).asJava, count[ClassA]() ) // 后续约束操作
内容的提问来源于stack exchange,提问作者Vincenzo Moreno Luna
相关产品推荐
相关产品推荐

