0

来自 StackOverflow 的 Scala 专家。

在下面的示例代码中,我重现了我正在处理的项目中面临的行为。我应该能够推断/测量在类字段成员中存在时定义的注释“武器”泛型类型。

import scala.reflect.runtime.universe._
import scala.annotation.StaticAnnotation

class Reflection

object Reflection {

  def reflect[T: TypeTag](x: Class[T]): Type = {
    typeOf[T]
  }

  def main(args: Array[String]) {
    var tpe = reflect(classOf[Hero])
    for (member <- tpe.members)
      for (annotation <- member.annotations)
        annotation.tpe match {
          case t if t <:< typeOf[weapon[_]]
                  => println(s"found weapon member: $member")
          case t if t <:< typeOf[action]
                  => println(s"found action member: $member")
        }
  }
}

class weapon[T <: WeaponType](x: String = null) extends StaticAnnotation
class action extends StaticAnnotation
class WeaponType(damage: Int)
case class Knife extends WeaponType(12)

class Hero {

  @weapon[Knife] var weapon: String = _
  @action def hitWithKnife() {

  }

}

然而,在我提供的示例代码中,我无法避免 REPL 将奇怪的日志打印为

 [] ?_$1 setInst sample.Knife

提前致谢

编辑

'@alexwriteshere' 正确地解释了日志让我感到无聊的原因。他让我觉得我的问题很困惑。

问题

可以推断/测量在类成员的@weapon 上定义的 T 类型(如在我的 Hero 类的武器成员中所见)。

4

1 回答 1

1

关于标准输出,这是 2.10.0 和 2.10.1 中的问题

要获取 的类型Knife,您可以执行以下操作:

val paramType: Type = t.asInstanceOf[TypeRefApi].args.head

然后你可以将它与 Type 的实例进行匹配。

于 2013-04-03T14:25:55.250 回答