我想知道为什么这不起作用(缺少参数类型)?
Seq(1,2,3).toSet.map(_ + 1)
但这确实是:
val foo = Seq(1,2,3).toSet
foo.map(_ + 1)
以及这个:(3)
Seq(1,2,3).toSet[Int].map(_ + 1)
或这个:
Seq(1,2,3).toList.map(_ + 1)
toSet
的特殊之处在于,它使第一种情况下的类型变得宽松,而第二种情况下的类型却没有呢? 最佳答案
有根据的猜测:
def toSet[B :> A]: Set[B]
与
def toList: List[A]
出于某种原因
toSet
是参数化的-如果将toSet
和map
拆分为两个语句,则在第一种情况下,编译器将不得不假设某些内容并将该类型分配给val
,然后在B
中使用被猜测为A
的map
。但是,使用
Seq(1,2,3).toSet.map
时,它猜测应该将某些B >: Int
映射到……到底是什么?仅当您知道_ * 2
的类型时,才可以猜测_
的类型。长话短说,
[B :> A]
似乎是个问题,因为如果这样做的话:implicit class AsSetOps[F, A](val fa: scala.collection.SeqLike[A, F]) {
def asSet: Set[A] = fa.toSet[A]
}
Seq(1,2,3).asSet.map(_ * 2)
有用。
我只能猜测这是使
toSet
协变量适得其反的一些尝试。