3

次のようなコード:

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]

私の質問は:

  1. PC と Android で同じコードが異なる結果を出力するのはなぜですか?
  2. PCのような適切なタイプを取得するには?

更新しました:

Option[T]、T は Int、Long、Byte などのプリミティブ型のみがこの問題を抱えています。Option[java.lang.Long] を使用すると、期待どおりに出力されます。

4

1 に答える 1

0

Android は Java と 100% 互換ではありません。表示されているのは、Java リフレクション API の違い、または DalvikVM への変換中に失われた Scala リフレクション API に必要な注釈の結果です。

于 2013-04-15T23:10:05.727 に答える