【问题标题】:Using ClassTag/TypeTag instead of ClassManifest in Scala 2.10在 Scala 2.10 中使用 ClassTag/TypeTag 而不是 ClassManifest
【发布时间】:2013-02-21 14:49:41
【问题描述】:

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

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
    }

【问题讨论】:

    标签: scala scala-2.10


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 是的,你是对的,真正的代码更多地涉及构建实例。
      猜你喜欢
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2016-09-12
      • 1970-01-01
      相关资源
      最近更新 更多