0

如果这个问题的解决方案太明显或者之前已经在这个论坛中解决了,请见谅(在这种情况下,请指点我的帖子)。

我有一堂课

org.personal.exercises.LengthContentsPair (l: Int, c: String) 
{
    val length = l
    val contents = c

}

然后,在同一个源文件中,我还定义了一个隐式值,它定义了这种类型的对象的排序方式,因此:

object LengthContentsPair  {

    implicit val lengthContentsPairOrdering = new Ordering [LengthContentsPair] {

       def compare (a: LengthContentsPair, b: LengthContentsPair)= {
   
          a.length compare b.length;
       }
    }
 }

以下是本论坛给出的解决方案。

现在,我想创建一个专门的 Set,它将 Set 中的元素数量限制为给定数量。因此,我定义了一个单独的类,如下所示:

import scala.collection.immutable.TreeSet;

import org.personal.exercises.LengthContentsPair.lengthContentsPairOrdering;

class FixedSizedSortedSet [LengthContentsPair]  extends TreeSet [LengthContentsPair]  
{ .. 
}

对我来说,这似乎是继承 TreeSet 的正确方法。但是,编译器会抛出以下错误:

(1) 没有为 LengthContentsPair 定义隐式排序。

(2)构造函数TreeSet的参数不够:(隐式排序:Ordering[LengthContentsPair])scala.collection.immutable.TreeSet[LengthContentsPair]。未指定的值参数排序。

我是否错误地理解了范围规则?我觉得这很容易,但我不能把手放在它上面。

4

1 回答 1

1

你定义FixedSizedSortedSet错了。您的实现具有名为的泛型类型参数LengthContentsPair,与具有该名称的类无关。换句话说,你有LengthContentsPair泛型类型的影子类。

如果您需要一个仅包含 的元素的专用集合LengthContentsPair,那么您可能的意思是:

class FixedSizedSortedSet extends TreeSet[LengthContentsPair]  
{ .. 
}

如果一个实例Ordering[LengthContentsPair]是可见的,这应该可以工作。但这应该不是问题,因为排序是在伴随对象中定义的,LengthContentsPair并且默认情况下作为隐式参数可见。

但是,如果您更需要一个TreeSet可以容纳任何类型元素的通用扩展,那么您的意思可能是这样的:

class FixedSizedSortedSet[T](implicit ordering: Ordering[T]) extends TreeSet[T]  
{ .. 
}

需要隐式参数,因为TreeSet需要一个隐式参数Ordering[T],所以我们需要将该要求转发给FixedSizedSortedSet

顺便提一句。我建议您考虑用 case class 替换您LengthContentsPair课程

于 2013-01-24T13:57:04.083 回答