我对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
的子类型。
答案 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]