2

次のようなランダムなクラスをインスタンス化するコードがあります。

trait T
class A extends T
class B extends T
class C extends T

def createRandomT = {
    val choices = Vector(classOf[A], classOf[B], classOf[C])
    val cls = new scala.util.Random().shuffle(choices).head
    instantiateT(cls)
}                                   

def instantiateT(cls: Class[_ <: T]) = {
    ClassManifest.fromClass(cls) match {
        case c if c <:< classManifest[A] => new A
        case c if c <:< classManifest[B] => new B
        case c if c <:< classManifest[C] => new C
    }
}

これは機能しますが、2.10 にアップグレードすると、instantiateTさまざまな非推奨の警告が表示されます。

ClassTagand/orを使用して機能を複製する方法のヒントはありTypeTagますか?

編集:ダニエルが指摘したように、これは機能します:

    cls match {
        case c if c.isAssignableFrom(classOf[A]) => new A
        case c if c.isAssignableFrom(classOf[B]) => new B
        case c if c.isAssignableFrom(classOf[C]) => new C
    }
4

2 に答える 2

2

なぜそれほど複雑にする必要があるのか​​ わかりません...確かに、Classインスタンスが既にある場合は、単に呼び出すことができますClass.newInstanceか? そのようです:

def instantiateT(cls: Class[_ <: T]) = cls.newInstance

それとも、実際のコードでは、各クラスがコンストラクターに渡す (既定の) 引数の個別のリストを持っているため、一致を実行している可能性がありますか?

于 2013-02-21T15:16:24.480 に答える
2

をお持ちの場合はClass、そのまま使用してくださいisAssignableFrom

case c if cls.isAssignableFrom(c.getClass()) => new A
于 2013-02-21T15:06:27.680 に答える