我想要一个这样的方法:
def foo[O] = O(1,2,3)
Run Code Online (Sandbox Code Playgroud)
其中“O”将是具有定义的 apply 方法的 Scala 对象。通过我的签名,我收到了“无法解析符号 O ”的错误消息。
调用 foo 将“Set”或“List”作为参数传递给我“ Type XXX需要类型参数”。将伴随对象作为参数类型传递的方法是什么?
如何创建此方法?
将 apply 方法(在你说 时调用的东西List(1, 2, 3))作为参数传递:
def foo[O](apply: (Int*) => O): O = apply(1, 2, 3)
println(foo(List.apply))
->
List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的想传入一个 Collection 类的伴生对象(虽然这不如上面的解决方案通用),你可以传入GenericCompanion像List伴生这样的对象:
def foo[O[T] <: GenTraversable[T]](comp: GenericCompanion[O]): O[Int] = comp(1, 2, 3)
println(foo(List))
->
List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
请注意,这需要在编译器中启用更高级的类型。
或者,您可以使用隐式 CanBuildFrom(这些是为您为所有集合定义的),而不是传入伴随对象:
def foo[O[_]](implicit bf: CanBuildFrom[O[_], Int, O[_]]): O[Int] =
bf().++=(Seq(1, 2, 3)).result().asInstanceOf[O[Int]]
println(foo[List])
->
List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)