简体   繁体   English

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

[英]Using ClassTag/TypeTag instead of ClassManifest in Scala 2.10

I have some code to instantiate a random class like this: 我有一些代码可以实例化如下所示的随机类:

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

This works, but after upgrading to 2.10 instantiateT gives various deprecation warnings. 这可行,但是在升级到2.10之后, instantiateT会给出各种弃用警告。

Any hints how to replicate the functionality with ClassTag and/or TypeTag ? 任何提示如何使用ClassTag和/或TypeTag复制功能?

Edit: As pointed out by Daniel this works: 编辑:正如丹尼尔指出,这有效:

    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
    }

如果您有一个Class ,则应该只使用isAssignableFrom

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

I am not sure why it has to be so complicated... Surely if you already have a Class instance you can just call Class.newInstance ? 我不确定为什么它必须这么复杂...当然,如果您已经有一个Class实例,您可以直接调用Class.newInstance Like so: 像这样:

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

Or maybe you are performing a match because in your real code each class has a separate list of (default) argument to pass to the constructor? 或者也许您正在执行匹配,因为在您的真实代码中,每个类都有一个单独的(默认)参数列表,以传递给构造函数?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM