请原谅我,如果此问题的解决方案过于明显或已在此论坛中得到解决(在这种情况下,请指向我的帖子)。
我有一个班级
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]。未指定的值参数排序。
我是否错误地理解了范围规则?我觉得这很容易,但我不能把它放在上面。
答案 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
课程。