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
提前致谢
修改
问题
可以在类成员中推断/测量@weapon上定义的T类型(从我的Hero类的武器成员看到)。
答案 0 :(得分:1)
关于标准输出,这是2.10.0和2.10.1中的issue。
要获得Knife
的类型,您可以执行以下操作:
val paramType: Type = t.asInstanceOf[TypeRefApi].args.head
然后你可以将它与Type的实例相匹配。