从scala中的类型名称获取类型

时间:2012-05-21 00:25:38

标签: scala reflection types

在使用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的内容允许从其名称中获取类型? (或者更一般地说,我可以使用type作为变量吗?)

2 个答案:

答案 0 :(得分:7)

因此,StackOverflow的一个问题是没有人会给我点“哇,这很聪明。为了上帝的缘故,不要做那样或类似的东西。”尽管如此,作为一名高级建筑师,这似乎是我的大部分工作。

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

答案 1 :(得分: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