[rules-users] [planner] Drools planner & Scala => Solution.getScore():Score<?>

Geoffrey De Smet ge0ffrey.spam at gmail.com
Sat Feb 6 04:14:27 EST 2010


Hi Adam,

Michael Neale (the drools guvnor guy) is also using Scala and Drools 
Planner together. His code is at github.
He doesn't use such a hack (maybe he's still at drools 5.0.1 where it 
was a double instead of Score). Why doesn't he?

If the issue still makes sense, feel free to open an issue for the
   org.drools.planner.core.solution.Solution#getScore():Score<?>
discussion (and copy this part of the discussion).
Why should it be Score<?> and not
2) Score<S extends Score>
3) or Score<<S extends Score<S extends Score> >> ?

4) Or maybe it should be, just like EnumSet?
class Solution<S extends Score> {
    public S getScore()
}

I don't like to fiddle trial&error with generics just "so it gives less 
compiler issues". Only when the other alternatives are proven worse 
(especially by referring to JDK class examples/conventions) and if it 
makes sense, I 'll be happy to apply a fix and adjust the examples and 
UpgradeRecipe. Better yet: a patch to do that is welcome too (if the 
discussion proves it to be the best option).


With kind regards,
Geoffrey De Smet


Adam Warski schreef:
> Hello,
> 
> I'm using Planner in a Scala program and it almost works without problems; the only one is in implementing the Solution interface, as it uses raw (erased) version of Score, which is normally generic (Score<S extends Score>). Scala generally doesn't like raw types and in most cases it's impossible to extend/implement interfaces which use them. A work-around is to introduce an "adapter" in Java, which you can later extend in Scala:
> 
> public abstract class ScalaSolution implements Solution {
>     public Score getScore() { return getScoreScala(); }
>     public abstract Score<?> getScoreScala();
> 
>     public void setScore(Score score) { setScoreScala(score); }
>     public abstract void setScoreScala(Score<?> score);  
> }
> 
> and then in Scala:
> 
> class Schedule(...) extends ScalaSolution {
>   var score: Score[_] = _
> 
>   def setScoreScala(score: Score[_]) = { this.score = score }
>   def getScoreScala = score
> 
>   ...
> }
> 
> So the fix is to replace the raw Score type with Score<?>. Maybe it would be possible to apply that in the code? I tried it locally and it compiles without problems.
> 
> And a side question: do you have any plans on implementing multithreading in planner? So that several moves could be explored concurrently? I saw there's an open Jira issue for some time, but it didn't have any timeframe information.
> 




More information about the rules-users mailing list