Senia的解决方案很棒。不幸的是,正如他所提到的,这对于Map
和String
都不起作用。
下面是另一种替代方法(基于他的解决方案),可以实现:
import collection.generic.CanBuildFrom
import collection.breakOut
class Build[To]
def build[TargetSuperType] = new Build[TargetSuperType]
implicit def buildToCbf[From, T, TargetSuperType, To<:TargetSuperType](b: Build[TargetSuperType])
(implicit cbf: CanBuildFrom[Nothing,T,To]): CanBuildFrom[From,T,To] =
collection.breakOut
List(1, 2, 3).map{i => (i * 2, i / 2.0, i.toString)}(build[Array[_]])
List(1, 2, 3).map{i => (i * 2, i.toString)}(build[Map[_,_]])
List('a', 'b', 'c').map(_.toUpper)(build[String])
这更加详细,因为现在你不仅要执行
build[Array]
,而是
build [Array [_]]
。作为交换,您可以指定任何目标集合,而不管类型参数的数量(例如
Map
和
String
)。
此外,如果选择,您仍然可以完全明确(类似于使用
breakOut
)。
scala> List(1, 2, 3).map{i => (i * 2, i / 2.0, i.toString)}(build[Array[(Int, Double, String)]])
res3: Array[(Int, Double, String)] = Array((2,0.5,1), (4,1.0,2), (6,1.5,3))
所有这些都使用相同的语法(换句话说,使用您请求的相同名称build
)