我正在完成Coursera课程,Scala中的功能编程原理。我从第3周开始采用IntSet示例并尝试使用泛型。此时非常简短地介绍了泛型,所以我可能做了一些明显错误的事情,但我不清楚。我从make T<:Comparable开始,但是我发现Ordered,所以我试图要求订购中的值。问题是我遇到了类型不匹配,预期:T,实际T'几个地方的错误;我已经在下面的来源中评论了这些内容。这是一个奇怪的错误;它找到了预期的类型,但这是一个错误?注意:这不是一项任务,所以我不是要求任何人为我考试。我只是想回去让Set类型更有用,我遇到了这种意想不到的行为enter code here
。谢谢你的帮助。
package week3
trait Set[T <: Ordered]
{
def isEmpty: Boolean
def contains(i: T): Boolean
def include(i: T): Set[T]
def union(that: Set[T]): Set[T]
}
/**
* empty set
*/
class EmptySet[T <: Ordered] extends Set[T]
{
def isEmpty = true;
def contains(i: T): Boolean = false
def include(i: T): Set[T] =
new TreeSet(i, new EmptySet[T], new EmptySet[T])
def union(that: Set[T]): Set[T] = that
override def toString() = "{}"
}
/**
* Immutable set
*
* @param value
* @param left
* @param right
*/
class TreeSet[T <: Ordered] (value: T, left: Set[T], right: Set[T]) extends Set[T]
{
def isEmpty = false;
def this(v: T) = this(v, new EmptySet[T], new EmptySet[T])
def contains(v: T): Boolean =
{
if(v < value) left.contains(v) // Type mismatch, expected: T, actual T
else if(v > value) right.contains(v) // Type mismatch, expected: T, actual T
else true
}
def include(v: T): Set[T] =
{
if(v < value) new TreeSet(value, left.include(v), right) // Type mismatch, expected: T, actual T
else if(v > value) new TreeSet(value, left, right.include(v)) // Type mismatch, expected: T, actual T
else this
}
def union(that: Set[T]): Set[T] =
{
if(that.isEmpty) this
else if(that == this) this
else ((left union right) union that) include value
}
override def toString() = "{ " + left.toString + ' ' + value + ' ' + right.toString + " }"
}
答案 0 :(得分:5)
Ordered
也有参数类型。您应该将其用作Ordered[T]
来修复它。 Set
类型应为T <: Ordered[T]
。这不是斯卡拉的问题。这是使用java的Comparable
接口的正确方法。