0

私は 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ます。

4

1 に答える 1

1

ジェネリック型Tを のサブタイプに制限するには、次の演算子Rectangleを使用します。<:

class Rectangle
class GenericThing[T <: Rectangle](x: T)

new GenericThing(new Rectangle) // fine
new GenericThing(5) // inferred type arguments [Int] do not conform to class GenericThing's type parameter bounds [T <: Rectangle]
于 2013-01-04T02:41:05.573 に答える