次のようなコード:
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]
私の質問は:
- PC と Android で同じコードが異なる結果を出力するのはなぜですか?
- PCのような適切なタイプを取得するには?
更新しました:
Option[T]、T は Int、Long、Byte などのプリミティブ型のみがこの問題を抱えています。Option[java.lang.Long] を使用すると、期待どおりに出力されます。