我想知道为什么这不起作用(缺少参数类型)?

 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是参数化的-如果将toSetmap拆分为两个语句,则在第一种情况下,编译器将不得不假设某些内容并将该类型分配给val,然后在B中使用被猜测为Amap

但是,使用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协变量适得其反的一些尝试。

09-27 17:08