Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Scala对象/伴生对象作为参数化类型传递_Scala_Generics - Fatal编程技术网

将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())