我可以在Scala中从带注释的成员中测量注释泛型类型吗?

时间:2013-04-03 13:05:06

标签: scala generics reflection annotations

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类的武器成员看到)。

1 个答案:

答案 0 :(得分:1)

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

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

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

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