将Scala对象/伴生对象作为参数化类型传递
我想有一个这样的方法:将Scala对象/伴生对象作为参数化类型传递,scala,generics,Scala,Generics,我想有一个这样的方法: def foo[O] = O(1,2,3) 其中“O”是一个定义了apply方法的scala对象。通过签名,我得到了“无法解析符号O”错误 调用foo将“Set”或“List”作为参数传递给我的是“Type XXX takes Type parameter”。以参数化类型传递伴随对象的方式是什么 如何创建此方法?将apply方法(当您说List(1,2,3)时调用的东西)作为参数传递: def foo[O](apply: (Int*) => O): O = app
def foo[O] = O(1,2,3)
其中“O”是一个定义了apply方法的scala对象。通过签名,我得到了“无法解析符号O”错误
调用foo将“Set”或“List”作为参数传递给我的是“Type XXX takes Type parameter”。以参数化类型传递伴随对象的方式是什么
如何创建此方法?将apply方法(当您说List(1,2,3)
时调用的东西)作为参数传递:
def foo[O](apply: (Int*) => O): O = apply(1, 2, 3)
println(foo(List.apply))
->
List(1, 2, 3)
或者,如果您确实希望传入集合类的companion对象(尽管这不如上述解决方案通用),可以传入GenericCompanion
对象,例如列表
companion:
def foo[O[T] <: GenTraversable[T]](comp: GenericCompanion[O]): O[Int] = comp(1, 2, 3)
println(foo(List))
->
List(1, 2, 3)
使用
.type
属性引用伴生对象的类型。如果要创建伴生对象列表,请执行以下操作:
object MyObject {
def apply():Unit = {
println("Hello, world")
}
}
val c = List[MyObject.type](MyObject, MyObject)
c.foreach(_.apply())
因为这样的声明毫无意义。你想做什么?我知道这没有任何意义,这就是为什么我问:)我想要这样的东西:foo[Seq]=Seq(1,2,3)foo[List]=List(1,2,3)所以我不认为他们想要创建一个伴随对象的列表。只有一个类型为
MyObject.type
-创建一个列表是没有意义的。OP特别要求“调用foo传递一个“Set”或“list”作为参数,给我“type XXX接受type”参数“.将伴生对象作为参数类型传递的方法是什么?”我给出了一种创建列表或集合的方法谢谢!我以为有一种方法可以只使用符号foo[list],但我发现不是这样的possible@Stefano这实际上是可能的,请参见我的编辑,但它实际上仍然传递(隐式)参数谢谢@Vitruvius,你太棒了:)
object MyObject {
def apply():Unit = {
println("Hello, world")
}
}
val c = List[MyObject.type](MyObject, MyObject)
c.foreach(_.apply())