这样的代码:
import scala.reflect.runtime.{universe => ru, currentMirror => cm}
import ru._
def test[T:TypeTag](obj: T) {
for (c <- typeOf[T].declarations; if c.annotations.exists(_.tpe =:= ru.typeOf[Message])) {
val tpe = c.asClass.selfType
for (m <- tpe.declarations.sorted) {
println("Member type: " + m.typeSignature)
}
}
}
object Test extends App {
test(TestMessageDef)
}
object TestMessageDef {
@Message
case class A(d: Option[Long])
}
消息定义:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Message {
}
在PC上我可以得到正确的输出:
Member type: Option[Long]
但是在Android上,我得到的输出是:
Member type: Option[java.lang.Object]
我的问题是:
更新:
只有Option [T],T是Int,Long,Byte等基本类型都有这个问题。如果我使用Option [java.lang.Long]它会按预期输出。
答案 0 :(得分:0)
Android与Java不是100%兼容。您所看到的是Java Reflection API差异的结果,或Scala反射API在转换为DalvikVM时丢失所需的注释。