从scala中的类型名称获取类型
在摆弄scala之后,我找到了从给定类型创建新对象的解决方案从scala中的类型名称获取类型,scala,reflection,types,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 }
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 {
}
我的问题
这可以吗?或者我现在使用scala 2.9.2时有不同的方法来实现这一点
是否有类似Class.forName的东西允许从其名称获取类型?或者更一般地说,我可以使用类型作为变量吗
或者,您可以通过[T]类考试:
您可以使用Class.forName,但您将失去类型安全性,因为字符串类名可以是任何东西,而不仅仅是实体子类,而且我认为您的返回类型必须是实体。或者,您可以传递类[T]:
您可以使用Class.forName,但您将失去类型安全性,因为字符串类名可以是任何东西,而不仅仅是实体子类,而且我认为您的返回类型必须是实体。因此StackOverflow的一个问题是,没有人会因为我说哇,这很聪明而给我打分。看在上帝的份上,千万别那样做。尽管如此,作为一名高级架构师,这似乎是我的大部分工作
如果您在外部或库中使用反射,或者将其作为与库交互的理由,那么您的做法是错误的。所以停下来。StackOverflow的一个问题是,没有人会因为我说哇,这很聪明而给我打分。看在上帝的份上,千万别那样做。尽管如此,作为一名高级架构师,这似乎是我的大部分工作
如果您在外部或库中使用反射,或者将其作为与库交互的理由,那么您的做法是错误的。停下来。是的,长官,舰长!我打字的时候向你致敬,先生!现在,说真的,有什么特别的原因吗?是的,长官,长官!我打字的时候向你致敬,先生!现在,说真的,有什么特别的原因是错误的吗?Class.forName将返回一个类,而不是实体的实例,所以这将总是失败。Class.forName将返回一个类,而不是实体的实例,所以这将总是失败。
var e = Entity.get[Implementation]
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])