Scala - 编写非通用树。类型参数问题

时间:2013-01-04 01:51:11

标签: scala generics tree variance

我对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是某个类的子类型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的子类型。

1 个答案:

答案 0 :(得分: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]