在使用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]
我的问题
没问题,或者有不同的方法(我现在使用scala 2.9.2)?
是否有类似Class.forName的内容允许从其名称中获取类型? (或者更一般地说,我可以使用type作为变量吗?)
答案 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
。