隐式概念中的差异用于创建集合的类型的订购

时间:2013-01-24 13:24:16

标签: scala scala-collections implicit-declaration

请原谅我,如果此问题的解决方案过于明显或已在此论坛中得到解决(在这种情况下,请指向我的帖子)。

我有一个班级

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]。未指定的值参数排序。

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

1 个答案:

答案 0 :(得分: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课程。