EmptyNode.type类型的表达式不符合预期类型SortedList [T]

时间:2015-01-03 13:32:28

标签: scala

我有一个非常简单的类型声明,我认为它会起作用,但它没有,任何关于这里错误的想法:

object SortedList {

  def apply[T]() : SortedList[T] = EmptyNode

}

trait SortedList[T <: Ordered]

private case class Node[T](value : T, next : SortedList[T]) extends SortedList[T]
private object EmptyNode extends SortedList[Nothing]

我非常确定EmptyNode SortedList[T] T适用于任何{{1}}。

1 个答案:

答案 0 :(得分:1)

你应该将trait的参数声明为covariant:

trait SortedList[+T]

这样EmptyNode将成为所有其他SortedList的子类型。

原来我的代码错了(我还没有测试过)。感谢@som-snytt指出问题所在。在我看来,原问题的问题是不可能的。这是我能得到的最接近的:

object SortedList {
  def apply[T]() : SortedList[T] = EmptyNode
}

class SortedList[+T: Ordering]{
}

private case class Node[T:Ordering](value : T, next : SortedList[T]) extends SortedList[T]
implicit val nothingOrdering = new Ordering[Nothing] {
  def compare(x: Nothing, y: Nothing) = 0
}
private object EmptyNode extends SortedList[Nothing]

不幸的是,这使得以下内容也可以编译:

val s: SortedList[Thread] = SortedList()

可能不同的 - Nothing - 下限是一个解决方案,但可能是参数化的apply是不可避免的。