2013-04-03 47 views
0

來自StackOverflow的Scala專家。我可以從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形(如在武器部件從我的英雄類看到的)。

回答

1

關於stdout,這是2.10.0和2.10.1中的issue

要獲得Knife類型,你可以這樣做:

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

然後你可以匹配它類型的實例。

+0

感謝您的快速解釋。我正在尋找這個日誌問題沒有成功。但是我想推斷我的英雄類中的@weapon上設置的T類型。我想我沒有解釋這個問題。 – Miere

+0

添加了獲取註釋參數的方式。這是你在找什麼? –

+0

很多謝謝老兄!有用。 – Miere