在Scala 2.10中使用ClassTag / TypeTag而不是ClassManifest

时间:2013-02-21 14:49:42

标签: scala scala-2.10

我有一些代码可以像这样实例化一个随机类:

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会发出各种弃用警告。

有关如何使用ClassTag和/或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
    }

2 个答案:

答案 0 :(得分:2)

如果您有Class,则应使用isAssignableFrom

case c if cls.isAssignableFrom(c.getClass()) => new A

答案 1 :(得分:2)

我不确定为什么它必须如此复杂...... 当然,如果您已有Class个实例,则可以拨打Class.newInstance?像这样:

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

或许您正在执行匹配,因为在您的实际代码中,每个类都有一个单独的(默认)参数列表传递给构造函数?