Как убрать предупреждение о стирании типа?

У меня есть этот код, который получает предупреждения abstract type pattern reflect.runtime.universe.MethodSymbol is unchecked since it is eliminated by erasure в каждом месте, где используется ключевое слово 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))
  }

person kelloti    schedule 24.04.2014    source источник


Ответы (1)


Устранить u, устранить предупреждение?

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)
person som-snytt    schedule 24.04.2014
comment
Пробовал, теперь получаю ошибки (not found: value Apply case Apply(_, List(Li...). Что-то здесь кажется неправильным. Интересно, попадаю ли я в экспериментальную часть API-интерфейсов отражения? - person kelloti; 24.04.2014
comment
@kelloti Похоже, ты делаешь что-то еще не так. Ваша исходная ошибка говорит вам, что она не может гарантировать, что MethodSymbol принадлежит вашей вселенной u, что кажется семантикой, когда вы указываете префикс, но не в том случае, если вы опускаете префикс. - person som-snytt; 24.04.2014
comment
Я нашел версию, которая работает, я редактирую ваш ответ, чтобы отразить. Это очень странно, но import scala.reflect.runtime.universe.MethodSymbol не удается, а import u.MethodSymbol удается без ошибок. - person kelloti; 24.04.2014