我想知道为什么这不起作用(缺少参数类型)?
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
的特殊之处在于,它使第一种情况下的类型变得宽松,而第二种情况下的类型却没有?
答案 0 :(得分:3)
有根据的猜测:
def toSet[B :> A]: Set[B]
vs
def toList: List[A]
由于某种原因toSet
是参数化的-如果将toSet
和map
拆分为两个语句,则在第一种情况下,编译器将不得不假设某些内容并将该类型分配给{{ 1}},然后在val
中使用猜为B
的{{1}}。
但是对于A
,它猜测应该将其映射到map
中……到底是什么?只有知道Seq(1,2,3).toSet.map
的类型,您才能猜测B >: Int
的类型。
长话短说,_ * 2
似乎是个问题,因为如果这样做的话:
_
有效。
我只能猜测是事与愿违的[B :> A]
协变的尝试。