3

私はこれを持っています:

abstract class Issue( ... ) extends Ordered[Issue] { 
  def compare(o : Issue) = due.compare(o.due)
  def render() : String
}

case class Task( ..., subtasks : scala.List[Subtask]) extends Issue( ... ) {
  def render() = ...
}

case class Subtask( ..., parent : String ) extends Issue( ... ) {
  override def compare(o:Subtask) = {
    ... delegate to some field's compare function ...
  }

  def render() = ...

}

使いたい

val l1 : List[Task] = tasks.sorted
val l2 : List[Subtask] = subtasks.sorted

しかし、それは機能しません:

error: diverging implicit expansion for type scala.math.Ordering[this.Subtask]

starting with method ordered in trait LowPriorityOrderingImplicits
         ,subtasks.sorted.map(_.render()).mkString(" | ")).mkString(" | ")

個々のコンストラクターに対して異なる順序でこの aglebraic 型を記述するにはどうすればよいですか?

4

2 に答える 2

2

親メソッドはSubtask異なるパラメータタイプを使用するため、親メソッドを正しくオーバーライドしていません。これを試して:

case class Subtask( ..., parent : String ) extends Issue( ... ) {
  override def compare(o: Issue) = o match {
    case x: Subtask => ... // your new comparison
    case x          => super.compare(x)
  }
  ...
}

ただし、ソートするときは、メソッドが。を取るため、Ordering[Issue]ではなく、が必要です。Ordering[Subtask]compareIssue

したがって、をソートするList[Subtype]には、コンパイラが正しいオブジェクトを取得するために、ではなくOrderingとして入力する必要があります。List[Issue]List[Subtask]

したがって、宣言する場所に型注釈を追加するsubtasksか、呼び出すときにそれをアップキャストします。

(subtasks: List[Issue]).sorted
于 2012-08-10T12:39:25.800 に答える
1

サブクラスを型パラメーターとして抽象スーパークラスに渡そうとしましたか? このようなもの:

abstract class Issue[I <: Issue[I]](...) extends Ordered[I] {
  def compare(o: I) = due.compare(o.due)
}

case class Task(...) extends Issue[Task](...)

case class Subtask(...) extends Issue[Subtask](...)
于 2012-08-10T09:20:32.703 に答える