1

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 {

}

そして使用法:

var e = Entity.get[Implementation]

私の質問

  1. それは大丈夫ですか、それとも別の方法がありますか(私は現在scala 2.9.2を使用しています)?

  2. その名前から型を取得できる Class.forName のようなものはありますか? (または、より一般的には、型を変数として使用できますか?)

4

2 に答える 2

7

したがって、StackOverflow の問題の 1 つは、「うわー、それは賢い。絶対にそんなことはしないでください」と言ったとしても、誰も私にポイントを与えてくれないということです。それにもかかわらず、シニア アーキテクトとして、それが私の仕事のほとんどのようです。

ライブラリの外部でリフレクションを使用している場合、またはライブラリとやり取りする理由として使用している場合は、間違っています。だからやめなさい。

于 2012-05-21T00:41:04.417 に答える
0

または、次を渡すこともできますClass[T]

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])

を使用できますClass.forNameが、型の安全性が失われます (文字列 className は Entity サブクラスだけでなく、何でもかまいません)。戻り値の型はEntity.

于 2012-05-21T00:34:14.140 に答える