关于Scala中结构类型成员的反射访问的警告

格雷格

此警告是什么意思:

结构类型成员方法getMap的反射访问应启用

警告中包含对scala文档的引用,但我不了解我的代码与解释之间的关系。(特别是解释中提到了反射...我的代码如何使用反射?)

我有这个:(Scala 2.11.2)

object getMap {
    implicit def fromOptionToConvertedVal[T](o:Option[T]) = new {
        def getMap[R] (doWithSomeVal:(T) => R) = new {
            def orElse(handleNone: => R) = o match {
                case Some(value) => doWithSomeVal(value)
                case None => handleNone
            }
        }
    }   
}

import getMap._
val i:Option[Int] = Some(5)
val x = i getMap (_*2) orElse 1

这将产生以下警告:

[warn] /Users/Greg/git/Favorites-Demo/src/main/scala/com/rs/server/ThriftServer.scala:34: reflective access of structural type member method getMap should be enabled
[warn] by making the implicit value scala.language.reflectiveCalls visible.
[warn] This can be achieved by adding the import clause 'import scala.language.reflectiveCalls'
[warn] or by setting the compiler option -language:reflectiveCalls.
[warn] See the Scala docs for value scala.language.reflectiveCalls for a discussion
[warn] why the feature should be explicitly enabled.
[warn] val x = i getMap (_*2) orElse 1
[warn]           ^
[warn] /Users/Greg/git/Favorites-Demo/src/main/scala/com/rs/server/ThriftServer.scala:34: reflective access of structural type member method orElse should be enabled
[warn] by making the implicit value scala.language.reflectiveCalls visible.
[warn] val x = i getMap (_*2) orElse 1
[warn]                        ^
麦格瑞格

我认为正在发生的事情是new { ... }对象是结构化类型的,需要进行反射才能实现。

根本原因是,Scala结构化类型允许根据对象实际使用的方法将它们视为许多类型的实例(例如鸭子类型)。JVM仅允许一种类型,因此,除了普通的虚拟方法调用之外,还必须通过其他方式访问不属于对象基础类型的方法。在这种情况下使用的机制是反射。

当scala编译器看到在结构化类型的对象上正在调用的方法的调用时(对某些优化进行模化),它将转换为以下方法调用:

a.f(b, c)

a.getClass
    .getMethod("f", Array(classOf[B], classOf[C]))
    .invoke(a, Array(b, c))

示例来自描述该技术的地方

Scala团队决定对每个人可能都不使用的高级功能强制实施选择加入政策。reflectiveCalls恰好是本SIP中记录的其中之一

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章