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 に答える