在Scala中实现具有原始类型的方法

iir*_*ekm 7 java scala drools drools-planner

我在Scala中使用Drools Planner(用Java编写)时遇到了问题.Drools规划器中的一个接口声明为:

public interface Score<S extends Score> extends Comparable<S>
Run Code Online (Sandbox Code Playgroud)

但是另一个界面使用'Score'作为原始类型:

public interface Solution {
    Score getScore();
Run Code Online (Sandbox Code Playgroud)

然后我想在Scala中实现这个接口:

class MySolution extends Solution {
    def getScore: Score = ...
Run Code Online (Sandbox Code Playgroud)

我得到一个编译错误:Scala编译器不允许编写'def getScore:Score'.当我尝试添加'Score [_]'或'Score [whatever]'编译器抱怨类型不兼容时.我该怎么办?

Dan*_*ral 9

编写一个Java类,作为Java接口需要的内容和Scala允许的内容之间的桥梁.

SolutionBridge.java:

abstract class SolutionBridge implements Solution {
    public Score getScore() {
        return scalaGetScore();
    }

    abstract Score<?> scalaGetScore();
}
Run Code Online (Sandbox Code Playgroud)

SolutionScala.scala:

class SolutionScala extends SolutionBridge {
    def scalaGetScore() = null.asInstanceOf[Score[_]]
}
Run Code Online (Sandbox Code Playgroud)


Geo*_*met 3

Drools Planner (5.2.0.M2)的下一版本将修复此问题这是 git 上的提交。

在某些情况下,人们希望定义自己的Score实现(例如NurseRosterScoreImplements HardAndSoftScore),以便能够向用户显示每个硬约束或软约束类型在最佳解决方案中到底违反了什么。这一改变是使这一过程变得更容易、更干净的第一步(尽管这已经是可能的)。