说,我们要做出这样的函数minBy
返回等于极简的所有元素集合在返回原来的集合类型而不是我们最初的List
。在泛型方法
所以我试图改变签名
def multiMinBy[A, B: Ordering, C <: Traversable[A]](xs: C)(f: A => B)
,希望我可能会得到一个C
回来,而不是一个Traversable[A]
。但是,我没有得到任何回报:
scala> multiMinBy(List("zza","zzza","zzb","zzzb"))(_.last)
<console>:9: error: inferred type arguments [Nothing,Nothing,List[java.lang.String]]
do not conform to method multiMinBy's type parameter bounds [A,B,C <: Traversable[A]]
我想这是因为我们有C
出现在参数之前A
已经推断?所以,我翻的参数的顺序,并且加入了铸:
def multiMinBy[A, B: Ordering, C <: Traversable[A]](f: A => B)(xs: C) = {
val minVal = f(xs minBy f)
(xs filter (f(_) == minVal)).asInstanceOf[C]
}
其作品,除了我们要这样称呼它:
multiMinBy((x: String) => x.last)(List("zza","zzza","zzb","zzzb"))
有没有保留原来的语法的方式,同时获得正确的收集类型?
是的,我同意,这是比我更好的解决方案。 –