私は Scala のジェネリックとバリアンスに戸惑い、いくつかのことを理解できません。
これが私がこれまでに持っているものです:
sealed abstract class Tree[+T]
case class Node[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] {
override def toString = "T(" + value.toString + " " + left.toString + " " + right.toString + ")"
}
case object End extends Tree[Nothing] {
override def toString = "."
}
object Node {
def apply[T](value: T): Node[T] = Node(value, End, End)
}
基本的な汎用二分木。私がやりたいのは、それを特殊化して、それT
がいくつかのクラス say のサブタイプになるようにすることですRectangle
。私がこれをしたい理由は、いくつかのaddValue
メソッドを使用するメソッドを作成することですRectangle
(つまり、 のいくつかのものを使用するツリーですRectangle
):
sealed abstract class Tree[+T] {
def addValue
}
私はOrdering
四角形で定義してこれを行うことができることを知っています:
sealed abstract class Tree[+T] {
def addValue[U >: T <% Ordered[U]](x: U): Tree[U]
}
T
しかし、 のサブタイプになるように制約する簡単な方法があると思いRectangle
ます。