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

任何提示如何使用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
    }
4

2 回答 2

2

如果你有一个Class,你应该只使用isAssignableFrom.

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

我不知道为什么它必须如此复杂......当然,如果你已经有一个Class实例,你可以调用Class.newInstance?像这样:

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

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

于 2013-02-21T15:16:24.480 回答