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]
}

但我觉得有一种更简单的方法可以限制TRectangle.

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 回答