我只想反转这个集合中的项,所以我决定要求它是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发布于 2012-07-28 03:29:38
Scala没有use-site variance,所以方法中不允许使用+A,只允许在类中使用。这里没有任何意义;我不认为您会错过它。此外,无论是在特征上还是在方法上,您都需要一个T。::没有在traversable上定义,但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)
}https://stackoverflow.com/questions/11694304
复制相似问题