我正在使用类似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")
一样隐藏类吗?
答案 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")