是否可以使用带有类型参数的`case object`?

时间:2015-02-23 18:58:05

标签: scala

我目前正在学习Scala,并想复制这个Haskell代数数据类型:

data Tree = Empty
          | Leaf Int
          | Node Tree Tree

这就是我在Scala中提出的:

sealed trait Tree[T]
case class Empty[T]() extends Tree[T]
case class Leaf[T](value: T) extends Tree[T]
case class Node[T](left: Tree[T], right: Tree[T]) extends Tree[T]

然而,有人告诉我,我应该使用case object Empty,我认为这是真的,因为它没有参数 - 但是它再次需要一个类型参数。

我尝试了以下但没有编译:

case object Empty[T] extends Tree[T]
case object Empty extends Tree[T]
case object Empty extends Tree

所以我想知道是否有办法在这个例子中使用case object

1 个答案:

答案 0 :(得分:15)

单身人士不可能是通用的,因为他们中只有一个是通用的。如果您希望Tree具有协变性(即Tree[Int]是[{1}}的子类型),那么您可以将类型定义为

Tree[Any]

否则,请将其保留为案例类。