Scala 如何消除类型擦除警告?

Scala 如何消除类型擦除警告?,scala,scala-2.10,Scala,Scala 2.10,我有一段代码,它获取的抽象类型模式reflect.runtime.universe.MethodSymbol是未选中的,因为在使用case关键字的每个地方,它都会被擦除警告消除。我觉得反射API有些奇怪。问题是,当我运行它时(通过和失败的代码路径),它就工作了,所以警告似乎是错误的。如何消除警告 import scala.reflect.runtime.{universe => u} val docs = { val ann = u.typeOf[T].members

我有一段代码,它获取的
抽象类型模式reflect.runtime.universe.MethodSymbol是未选中的,因为在使用
case
关键字的每个地方,它都会被擦除
警告消除。我觉得反射API有些奇怪。问题是,当我运行它时(通过和失败的代码路径),它就工作了,所以警告似乎是错误的。如何消除警告

  import scala.reflect.runtime.{universe => u}

  val docs = {
    val ann = u.typeOf[T].members
      .collect { case m: u.MethodSymbol if m.isGetter => m }
      .find(_.name.decoded == prop.propertyName)

    val docAnnotation = ann.flatMap(_.annotations.find(_.tpe.typeSymbol.name.decoded == "docs"))
    val trees = docAnnotation.map(_.scalaArgs).getOrElse(Nil)
    val args = trees.map {
      case u.Apply(_, List(u.Literal(u.Constant(value)))) => Some(value.asInstanceOf[String])
      case u.Select(_, name) if name.decoded == "None" => None
    }
    val safeGetArg = args.lift(_: Int).flatten

    Documentation(safeGetArg(0), safeGetArg(1))
  }
apm@mara:~$ scala210
Welcome to Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.reflect.runtime.universe
import scala.reflect.runtime.universe

scala> import universe._
import universe._

scala> class X { val x = 7 ; var y = "hi" }
defined class X

scala> typeOf[X].members collect { case m: MethodSymbol => m }
res0: Iterable[reflect.runtime.universe.MethodSymbol] = List(method y_=, method y, value x, constructor X, method $asInstanceOf, method $isInstanceOf, method synchronized, method ##, method !=, method ==, method ne, method eq, method notifyAll, method notify, method clone, method getClass, method hashCode, method toString, method equals, method wait, method wait, method wait, method finalize, method asInstanceOf, method isInstanceOf, method !=, method ==)

scala> typeOf[X].members collect { case m: MethodSymbol if m.isGetter => m }
res1: Iterable[reflect.runtime.universe.MethodSymbol] = List(method y, value x)

消除
u
,消除警告

  import scala.reflect.runtime.{universe => u}

  val docs = {
    val ann = u.typeOf[T].members
      .collect { case m: u.MethodSymbol if m.isGetter => m }
      .find(_.name.decoded == prop.propertyName)

    val docAnnotation = ann.flatMap(_.annotations.find(_.tpe.typeSymbol.name.decoded == "docs"))
    val trees = docAnnotation.map(_.scalaArgs).getOrElse(Nil)
    val args = trees.map {
      case u.Apply(_, List(u.Literal(u.Constant(value)))) => Some(value.asInstanceOf[String])
      case u.Select(_, name) if name.decoded == "None" => None
    }
    val safeGetArg = args.lift(_: Int).flatten

    Documentation(safeGetArg(0), safeGetArg(1))
  }
apm@mara:~$ scala210
Welcome to Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.reflect.runtime.universe
import scala.reflect.runtime.universe

scala> import universe._
import universe._

scala> class X { val x = 7 ; var y = "hi" }
defined class X

scala> typeOf[X].members collect { case m: MethodSymbol => m }
res0: Iterable[reflect.runtime.universe.MethodSymbol] = List(method y_=, method y, value x, constructor X, method $asInstanceOf, method $isInstanceOf, method synchronized, method ##, method !=, method ==, method ne, method eq, method notifyAll, method notify, method clone, method getClass, method hashCode, method toString, method equals, method wait, method wait, method wait, method finalize, method asInstanceOf, method isInstanceOf, method !=, method ==)

scala> typeOf[X].members collect { case m: MethodSymbol if m.isGetter => m }
res1: Iterable[reflect.runtime.universe.MethodSymbol] = List(method y, value x)

消除
u
,消除警告

  import scala.reflect.runtime.{universe => u}

  val docs = {
    val ann = u.typeOf[T].members
      .collect { case m: u.MethodSymbol if m.isGetter => m }
      .find(_.name.decoded == prop.propertyName)

    val docAnnotation = ann.flatMap(_.annotations.find(_.tpe.typeSymbol.name.decoded == "docs"))
    val trees = docAnnotation.map(_.scalaArgs).getOrElse(Nil)
    val args = trees.map {
      case u.Apply(_, List(u.Literal(u.Constant(value)))) => Some(value.asInstanceOf[String])
      case u.Select(_, name) if name.decoded == "None" => None
    }
    val safeGetArg = args.lift(_: Int).flatten

    Documentation(safeGetArg(0), safeGetArg(1))
  }
apm@mara:~$ scala210
Welcome to Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.reflect.runtime.universe
import scala.reflect.runtime.universe

scala> import universe._
import universe._

scala> class X { val x = 7 ; var y = "hi" }
defined class X

scala> typeOf[X].members collect { case m: MethodSymbol => m }
res0: Iterable[reflect.runtime.universe.MethodSymbol] = List(method y_=, method y, value x, constructor X, method $asInstanceOf, method $isInstanceOf, method synchronized, method ##, method !=, method ==, method ne, method eq, method notifyAll, method notify, method clone, method getClass, method hashCode, method toString, method equals, method wait, method wait, method wait, method finalize, method asInstanceOf, method isInstanceOf, method !=, method ==)

scala> typeOf[X].members collect { case m: MethodSymbol if m.isGetter => m }
res1: Iterable[reflect.runtime.universe.MethodSymbol] = List(method y, value x)

尝试过之后,现在我发现了错误(
未找到:value Apply case Apply(u,List(Li…
)。这里似乎有问题。我想知道我是否遇到了“实验性”问题部分反思APIs@kelloti听起来你在做其他错误。你最初的错误是告诉你,它不能保证MethodSymbol来自你的宇宙u,这似乎是你提供前缀时的语义,但如果你省略前缀则不是。我找到了一个有效的版本,我正在编辑你的答案以反映。t他很奇怪,但是导入scala.reflect.runtime.universe.MethodSymbol失败了,但是导入u.MethodSymbol成功了,没有错误。尝试了一下,现在我得到了错误(
未找到:value Apply case Apply(u,List(Li…
)。这里似乎有问题。我想知道我是否碰到了“实验性”问题部分反思APIs@kelloti听起来你在做其他错误。你最初的错误是告诉你,它不能保证MethodSymbol来自你的宇宙u,这似乎是你提供前缀时的语义,但如果你省略前缀则不是。我找到了一个有效的版本,我正在编辑你的答案以反映。this非常奇怪,但是导入scala.reflect.runtime.universe.MethodSymbol失败,但是导入u.MethodSymbol成功,没有错误。