我想反转这个集合中的项目,所以我决定要求它成为Traversable
的一部分,以及它的任何子类型,让它返回Traversable,但我想我可能我也需要使用方差,但是,目前我得到编译器错误,使用Scala 2.10.0-M5。
trait Polynomials {
def coefficients[+A <: Traversable[T]](x:A):Traversable[A] = x.foldLeft(Traversable[A]())((b,a) => a :: b)
}
这些是我得到的错误,我不确定我做错了什么。
Description Resource Path Location Type
']' expected but identifier found. Polynomials.scala line 4 Scala Problem
'=' expected but ']' found. Polynomials.scala line 4 Scala Problem
illegal start of simple expression Polynomials.scala line 5 Scala Problem
答案 0 :(得分:6)
Scala没有use-site variance,因此方法中不允许使用+A
,只允许在类中使用T
。无论如何,这里真的没有意义;我不认为你会错过它。此外,您需要在某个位置::
,无论是在特征上还是在方法上。并且List
没有在遍历上定义,但Traversable[T]
是可遍历的,因此您可以使用它。而你实际上是在返回Traversable[A]
,而不是trait Polynomials {
def coefficients[T, A <: Traversable[T]](x: A): Traversable[T] =
x.foldLeft(List[T]())((b,a) => a :: b)
}
。所以:
A <: Traversable[T]
但是trait Polynomials {
def coefficients[T](x: Traversable[T]): Traversable[T] =
x.foldLeft(List[T]())((b,a) => a :: b)
}
并没有真正为你买任何东西,因为无论如何,子类型都会让你知道。
{{1}}