【问题标题】:How to get Option[T] field type on Android in 2.10.1?如何在 2.10.1 的 Android 上获取 Option[T] 字段类型?
【发布时间】:2013-04-14 13:37:42
【问题描述】:

这样的代码:

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] 它会按预期输出。

【问题讨论】:

    标签: scala reflection scala-2.10


    【解决方案1】:

    Android 并非 100% 兼容 Java。您看到的是 Java 反射 API 差异的结果,或者 Scala 反射 API 所需的注释在转换为 DalvikVM 时丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2011-01-05
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多