1

在对 scala 进行了一番摆弄之后,我找到了从给定类型创建新对象的解决方案

object Entity {

  def get[T <: Entity: ClassManifest]: T = {

      val entity = implicitly[ClassManifest[T]].erasure.getConstructors()(0).newInstance().asInstanceOf[T]

      /** some stuff **/

      entity

  }

}

abstract class Entity {

}

class Implementation extends Entity {

}

然后用法:

var e = Entity.get[Implementation]

我的问题

  1. 可以吗,还是有一些不同的方法(我现在使用的是 scala 2.9.2)?

  2. 有没有像 Class.forName 这样的东西允许从它的名字中获取类型?(或更一般地说,我可以使用类型作为变量吗?)

4

2 回答 2

7

因此,StackOverflow 的问题之一是没有人会因为我说“哇,这太聪明了。看在上帝的份上,永远不要这样做或类似的事情”而给我积分。尽管如此,作为一名高级架构师,这似乎是我的大部分工作。

如果您在外部或库中使用反射,或者作为与库交互的原因,那么您做错了。所以停止它。

于 2012-05-21T00:41:04.417 回答
0

或者,您可以通过Class[T]

object Entity {
  def get[T <: Entity](e: Class[T]): T = {
    val entity = e.getConstructors()(0).newInstance().asInstanceOf[T]
    /** some stuff **/
    entity
  }
}

var e1 = Entity.get(classOf[Implementation])

您可以使用Class.forName,但您会失去类型安全性(因为字符串 className 可以是任何东西,而不仅仅是 Entity 子类),我认为您的返回类型必须是Entity.

于 2012-05-21T00:34:14.140 回答