我有一个非常简单的类型声明,我认为它会起作用,但它没有,任何关于这里错误的想法:
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}}。
答案 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
是不可避免的。