在Scala 2.10中使用ClassTag/TypeTag代替ClassManifest

在Scala 2.10中使用ClassTag/TypeTag代替ClassManifest,scala,scala-2.10,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)

我有一些代码来实例化一个随机类,如下所示:

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
    }
}

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

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

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

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

我不知道为什么会这么复杂。。。 当然,如果您已经有一个
实例,您可以调用
类.newInstance
?像这样:

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

def实例化et(cls:Class[p>我不知道为什么它会如此复杂。。。
当然,如果您已经有一个
实例,您可以调用
类。newInstance
?如下所示:

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

def instanceet(cls:Class)[是的,你是对的,真正的代码更多地涉及到构造实例。是的,你是对的,真正的代码更多地涉及到构造实例。