1

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

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

那么我们能以某种方式隐含地获得封闭类Creator.create("some name")吗?

4

1 回答 1

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")
于 2013-01-25T09:39:05.933 回答