Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从scala中的类型名称获取类型_Scala_Reflection_Types - Fatal编程技术网

从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 }

在摆弄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 {

}
我的问题

这可以吗?或者我现在使用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])