Sum*_*uma 8 import warnings scala implicit-conversion
在我的Scala代码中,我有一些隐式转换,我有必要的导入存在:
import scala.language.implicitConversions
Run Code Online (Sandbox Code Playgroud)
但是,有时当在此之后再进行另一次导入时,我会收到警告,好像导入根本不存在:
警告:(112,18)隐式转换方法pair2Dimension应该通过使隐式值scala.language.implicitConversions可见来启用.
build.sbt:
name := "ImplicitSBT"
version := "1.0"
scalaVersion := "2.11.5"
scalacOptions ++= Seq("-deprecation","-feature")
libraryDependencies += "org.scala-lang.modules" %% "scala-swing" % "1.0.1"
Run Code Online (Sandbox Code Playgroud)
Main.scala:
import scala.language.implicitConversions
import scala.swing.{Action, _}
object Main extends App {
implicit def pair2Dimension(pair: (Int, Int)): Dimension = new Dimension(pair._1, pair._2)
val dim : Dimension = (0,0)
println(dim)
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如何import scala.swing.{Action, _}隐藏implicitConversions导入?
导入scala.swing。{Action,_}如何隐藏hiddenConversions导入?
你的:
import scala.language.implicitConversions
Run Code Online (Sandbox Code Playgroud)
...得到由阴影implicitConversions 限定在scala.swing包对象:
package scala
...
package object swing {
...
implicit lazy val implicitConversions = scala.language.implicitConversions
...
}
Run Code Online (Sandbox Code Playgroud)
由于您在此处使用通配符导入:
import scala.swing.{Action, _}
Run Code Online (Sandbox Code Playgroud)
... scala.swing.implicitConversions从scala.swing阴影中最终导入scala.language.implicitConversions。
有趣的问题是:scalac如果有两个“功能标志”,为什么不知道启用了语言功能(implicitConversions在这种情况下),一个在同一个层次上又一个阴影,那么。
这可能是一个错误以及SIP 18的具体细节实现。
无论如何,要解决此问题,我建议您执行以下操作之一:
不导入scala.language.implicitConversions(因为通配符导入时已导入scala.swing)
不要从中导入通配符 scala.swing(请勿污染您的范围并导入所需的内容)
implicitConversions在Main对象级别进行另一次导入(没有被其他对象遮盖)
如中所述
http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html
通配符导入(如您所写)为所有Swing隐式定义赋予了很高的优先级,并且显然可以将您的隐藏。
由于您使用SBT进行编译,因此通过以下设置会不会容易得多
scalacOptions ++= Seq(
"-feature",
"-language:implicitConversions"
)
Run Code Online (Sandbox Code Playgroud)
并不再担心进口scala.language.implicitConversions什么地方合适?
| 归档时间: |
|
| 查看次数: |
5499 次 |
| 最近记录: |