Scala仿制药;为什么我会输入'类型不匹配,预期:T,实际T'

时间:2015-03-29 19:26:15

标签: scala

我正在完成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 + " }"
}

1 个答案:

答案 0 :(得分:5)

Ordered也有参数类型。您应该将其用作Ordered[T]来修复它。 Set类型应为T <: Ordered[T]。这不是斯卡拉的问题。这是使用java的Comparable接口的正确方法。