如何隐式getClass

时间:2013-01-25 08:41:52

标签: scala reflection implicits

我正在使用类似method(cl: Class[_], name: String)的方法签名在一些Java代码上编写Scala包装器,并且代码中的许多getClass方法看起来不太好:

Creator.create(getClass, "One")
Creator.create(getClass, "Two")
Creator.create(getClass, "Three")
Creator.create(getClass, "Four")

那么我们可以隐式地像Creator.create("some name")一样隐藏类吗?

1 个答案:

答案 0 :(得分:2)

回答1。

总的来说,我热烈反对反思。但是,如果你真的想这样做,在Scala 2.9.1中你可以使用Manifest

def create[T:Manifest](name:String) = {
   val klass:Class[_] = t.erasure
}

在scala 2.10中,您应该看看TypeTag。

回答2。

但是,正如我已经说过的,正确的方法不是使用类而是使用隐式构建器

trait Builder[T]{
     def build(name:String):T
}

def create[T](name:String)(implicit builder:Builder[T]) = {
      builder.build(name)
}

通过这种方式,您可以通过仅在范围内导入正确的含义来限制您可以创建的内容,您将不会依赖于反射,并且您不会冒险获得可怕的RuntimeExceptions

发表评论回答

如果你的观点是避免在每次调用时调用getClass,你可以执行以下操作

def create(name:String)(implicit klass:Class[_]) {

}

你可以这样称呼它

implicit val klass1 = myInstance.getClass
create("hello")
create("goodbye")