17

切换到 Scala 2.10 后,我收到大量警告:

结构类型成员方法的反射访问...应该通过使隐式值 language.reflectiveCalls 可见来启用

这是什么意思?

4

3 回答 3

17

该警告实际上告诉在文档中的何处查找解释:

Test.scala:9: warning: reflective access of structural type member method y should be enabled
by making the implicit value language.reflectiveCalls visible.
This can be achieved by adding the import clause 'import scala.language.reflectiveCalls'
or by setting the compiler option -language:reflectiveCalls.
See the Scala docs for value scala.language.reflectiveCalls for a discussion
why the feature should be explicitly enabled.

引用的 Scaladoc 条目(请务必单击左侧的 |> 箭头以展开文档条目)。

于 2012-11-12T05:42:55.230 回答
1

来自 Scala 文档:

为什么要控制它?反射并非在所有平台上都可用。ProGuard 等流行工具在处理它时存在问题。即使在反射可用的情况下,反射调度也会导致令人惊讶的性能下降。

想想这个使用匿名子类的代码:

class Student(val id:Int)
val specialStudent = new Student(0) {
   val greeting = "I am a special student with id " + id // Warning: id can be obfuscated
} 

链接到 Scala 文档

于 2017-12-17T21:59:32.143 回答
1

我用一个函数将一个Option[Double or Long]除以 100 时遇到了这个警告:

  def safeDivideBy100[T <: AnyVal { def toDouble: Double }](number: Option[T]): Option[Double] =
     number match {
       case None    => None
       case Some(x) => Some(x.toDouble / 100)
     }

修复它只需要添加到文件的顶部:

import scala.language.reflectiveCalls
于 2021-01-22T18:22:30.797 回答