Scala:生成伴生对象

Scala:生成伴生对象,scala,companion-object,Scala,Companion Object,是否存在为某个类的每个子类自动生成伴生对象的方法 例如,我有一个类组件[T],它有一个val伴星:CompType[T],其中T应该是子类。例如:类转换扩展组件[Transform] 是否有任何方法可以为每个子类生成相应的对象(虽然看起来很小),而不用为我创建的每种组件键入对象定义 编辑: 所有这些的最终目标是一个实体系统。每个伴生对象都有一个唯一的整数(它从继承的特征中获得),可用于从组件数组中查找特定类型的组件。例如,如果我想将转换组件添加到实体中,我会调用: addComponent(en

是否存在为某个类的每个子类自动生成伴生对象的方法

例如,我有一个
类组件[T]
,它有一个
val伴星:CompType[T]
,其中
T
应该是子类。例如:
类转换扩展组件[Transform]

是否有任何方法可以为每个子类生成相应的对象(虽然看起来很小),而不用为我创建的每种组件键入对象定义

编辑:

所有这些的最终目标是一个实体系统。每个伴生对象都有一个唯一的整数(它从继承的特征中获得),可用于从组件数组中查找特定类型的组件。例如,如果我想将转换组件添加到实体中,我会调用:

addComponent(entity, Transform, new Transform(params))
然后,新的
Transform
对象将被放置在表示实体的组件数组中,该实体位于Transform伴随对象提供的索引处。但是,由于伴生对象的索引来自它们继承的特征,因此除了名称之外,它们之间没有任何类型的区别。因此,为什么生成它们会很好


很抱歉,开头没有说得更具体。如果这仍然令人困惑,那很可能是我完全错了!如果您这样认为,请随时告诉我。

我认为没有任何方法可以在Scala中自动生成当前的伴生对象。即将到来的宏类型支持可能最终会帮助您,但这仍在开发中

如果我理解正确,那么伴生对象的存在只是为了提供一个每类唯一的整数?在这种情况下,也许这样的事情会起作用

scala> object UniqueNumberProvider {
     |   val numbers = new collection.mutable.HashMap[Class[_], Int]
     |   def numberForClass(clazz: Class[_]) = numbers.get(clazz) match {
     |     case Some(n) => n
     |     case None => numbers.update(clazz, numbers.size + 1); numbers.size
     |   }
     | }
defined module UniqueNumberProvider

scala> UniqueNumberProvider.numberForClass(classOf[String])
res7: Int = 1

scala> UniqueNumberProvider.numberForClass(classOf[String])
res8: Int = 1

scala> UniqueNumberProvider.numberForClass(classOf[Int])
res9: Int = 2

您可以使用Scala 2.10中的宏来执行此操作。
您可以在

中查找这些伴生对象的用法?你需要它们干什么?对不起,我真的应该提一下。我想让问题保持相对简短。我将编辑并添加更多详细信息。我不确定我是否能看到如何在宏当前状态下执行此操作(即def宏)。虽然我很高兴被证明是错的。你能举个例子吗?我很确定你需要类型宏来完成这个任务,Scala 2.10中没有,甚至还没有完全设计好,更不用说实现了。按照你的说法,你可以在调用numberForClass时有一个竞争条件。我错了吗?是的-目前的代码不是线程安全的(不想通过添加同步来混淆问题:-)这对我来说的问题是每次需要访问整数时都要进行映射查找。在这一点上,我还可以使用一个映射来存储组件。例如,在Java中,我将整数作为组件类本身的一个静态字段,这就是我将其放置在对象上的原因。在这种情况下,您可能不得不忍受额外的键入,因为至少目前情况是这样。我想是这样的。这与其说是实用性,不如说是好奇心,但无论如何都会很好。