【问题标题】:Replacing deprecated <:< Manifest type witness in Scala 2.10在 Scala 2.10 中替换已弃用的 <:< 清单类型见证
【发布时间】:2012-12-11 19:46:15
【问题描述】:

有人可以指出我应该在 scala 2.10 下做什么来代替 Manifest 上已弃用的类型见证吗?

reflect.ClassManifest.singleType(foo) <:< barManifest

老实说,我的目标只是将其替换为不会引发弃用警告的内容。我很高兴使用新的反射 API。

如果这很重要的话,这里是有问题的代码:

https://github.com/azavea/geotrellis/blob/master/src/main/scala/geotrellis/feature/op/geometry/geometry.scala#L45

【问题讨论】:

    标签: scala reflection scala-2.10


    【解决方案1】:

    如果您想要从清单到类型标签的相当直译,您需要获取适当的镜像,使用它来反映您的实例,然后在Type 上使用&lt;:&lt;。例如:

    import scala.reflect.runtime.currentMirror
    import scala.reflect.runtime.universe._
    
    sealed trait X
    case class Y(i: Int) extends X
    case class Z(j: String) extends X
    
    def filterX[A <: X: TypeTag](xs: List[X]) = xs.filter(
      x => currentMirror.reflect(x).symbol.toType <:< typeOf[A]
    )
    

    现在:

    scala> filterX[Z](List(Y(1), Y(2), Z("test")))
    res1: List[X] = List(Z(test))
    
    scala> filterX[Y](List(Y(1), Y(2), Z("test")))
    res2: List[X] = List(Y(1), Y(2))
    

    您可能有一些方法可以在您的应用程序中更充分地利用新的反射 API,但这应该可以工作并且会处理弃用警告。

    【讨论】:

    • 非常有帮助的答案!但是当我在我的项目中实际尝试此操作时,我收到以下运行时错误: 非法循环引用涉及类 LineString (at scala.reflect.internal.Symbols$TypeSymbol.tpe(Symbols.scala:27​​10)) 当然,这可能只是与所讨论的特定课程相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多