7

ScalaでDroolsPlanner(Javaで記述)を使用する際に問題があります。Droolsplannerのインターフェースの1つは次のように宣言されています。

public interface Score<S extends Score> extends Comparable<S>

ただし、別のインターフェースは「スコア」をrawタイプとして使用します。

public interface Solution {
    Score getScore();

次に、このインターフェースをScalaに実装したいと思います。

class MySolution extends Solution {
    def getScore: Score = ...

そして、コンパイルエラーが発生します:Scalaコンパイラーは「defgetScore:Score」だけを書くことを許可していません。'Score[_]'または'Score[whatever]'を追加しようとすると、コンパイラは型の非互換性について文句を言います。私は何をすべきか?

4

4 に答える 4

9

Javaインターフェースが必要とするものとScalaが許可するものとの間のブリッジとして機能するJavaクラスを記述します。

SolutionBridge.java:

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

    abstract Score<?> scalaGetScore();
}

SolutionScala.scala:

class SolutionScala extends SolutionBridge {
    def scalaGetScore() = null.asInstanceOf[Score[_]]
}
于 2011-03-11T23:06:28.557 に答える
4

省略したエラーメッセージは、余分な詳細ではありません。「これについてはScalaからのサポートも期待します」に関しては、エラーメッセージを読んでプロセスに参加し、理解できない場合は、漠然と言い換えるのではなく、質問するときにそれらを含めることもできます。

エラーメッセージ、それらは重要です。彼らが混乱しているときでさえ。特に彼らが混乱しているとき。

2.8.1のエラーは次のとおりです。

a.scala:2: error: overriding method getScore in trait Solution of type ()Score[_ <: Score];
 method getScore has incompatible type
  def getScore: Score[_] = null
      ^
one error found

トランクのエラーは次のとおりです。

a.scala:2: error: overriding method getScore in trait Solution of type ()Score[_ <: AnyRef];
 method getScore has incompatible type
  def getScore: Score[_] = null
      ^
one error found

そこには重要な違いがあります。これは、エラーメッセージの指示に従って、トランクで機能する理由に影響します。

// this compiles with 2.9, but not with 2.8
class MySolution extends Solution {
  def getScore: Score[_ <: AnyRef] = null
}

生の型ScoreがJavaソースで使用されている方法(ある場所では型コンストラクターとして、別の場所では暗黙の実存型引数を使用し、2番目の外観が最初の外観を境界付けている)、どこでも機能するのは不思議です。この種のものに対応することで、コンパイラにすでにどれだけのダメージが与えられているかを知りたくありません。生のタイプがうまく機能すればいいのは事実ですが、多くのことがいいでしょう。不可能なこともあれば、望ましくないこともあります。また、船を浮かせておく少数の人々の努力が必要なこともあります。生のタイプはトリプルクラウンを獲得します。

于 2011-03-13T03:43:12.973 に答える
3

Drools Planner(5.2.0.M2)の次のリリースでは、この問題が修正されます。 これがgitのコミットです。

場合によっては、独自のScore実装(たとえば、NurseRosterScoreimplements HardAndSoftScore)を定義して、ハードまたはソフトの制約タイプごとに、最良のソリューションで正確に違反しているものをユーザーに示すことができるようにしたい場合があります。この変更は、それをより簡単かつクリーンにするための最初のステップです(すでに可能ですが)。

于 2011-03-13T12:27:30.833 に答える
0

キャストしようとしましたかScore

val s = solution.getScore.asInstanceOf[Score[Int]]
于 2011-03-11T22:50:02.180 に答える