为什么scala.language.implicitConversions不是最后一次导入时发出警告?

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导入?

Eug*_*Loy 5

导入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.implicitConversionsscala.swing阴影中最终导入scala.language.implicitConversions

有趣的问题是:scalac如果有两个“功能标志”,为什么不知道启用了语言功能(implicitConversions在这种情况下),一个在同一个层次上又一个阴影,那么。

这可能是一个错误以及SIP 18的具体细节实现。

无论如何,要解决此问题,我建议您执行以下操作之一:

  1. 不导入scala.language.implicitConversions(因为通配符导入时已导入scala.swing

  2. 不要从中导入通配符 scala.swing(请勿污染您的范围并导入所需的内容)

  3. implicitConversionsMain对象级别进行另一次导入(没有被其他对象遮盖)


Pao*_*tti 5

如中所述

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什么地方合适?