Scala中@nowarn注解失效,求IntelliJ IDEA下消除lint警告方法
解决Scala中@nowarn不生效及IDE警告屏蔽问题
一、为什么@nowarn消不掉Function1/Function2的「syntactic sugar could be used」警告
你看到的这个警告是IntelliJ IDEA内置的代码检查提示,不是Scala编译器(scalac)发出的编译警告。而@nowarn注解只能屏蔽Scala编译器产生的警告,对IDE自己的lint检查完全无效——这点从你贴的sbt日志也能验证:编译过程根本没报这个警告,只有IDE里会显示。
解决方式
- 用语法糖替代(推荐)
直接换成Scala的函数语法糖,从根源消除警告:
private val simpleIncrementer: Int => Int = _ + 1 private val stringConcat: (String, String) => String = _ + _
- 在IntelliJ中单独禁用该检查
- 右键IDE里的警告提示,选择「Inspection 'Syntactic sugar could be used' options」,可选择仅禁用当前文件、当前方法的该检查,或者全局取消。
- 也可以通过设置路径:
File -> Settings -> Editor -> Inspections -> Scala -> Simplification,取消勾选「Syntactic sugar could be used」。
二、正确用@nowarn屏蔽编译器警告
你代码里的@nowarn def f能屏蔽「Access can be private」,因为这是编译器警告。要屏蔽def a里的「A pure expression does nothing in statement position」(编译器错误码E129),可以精准匹配:
精准匹配警告内容
@nowarn("msg=A pure expression does nothing in statement position") def a = { 1; deprecated() }
匹配警告类别
也可以通过警告类别来屏蔽,这个警告属于lint-pure-statement类别:
@nowarn("cat=lint-pure-statement") def a = { 1; deprecated() }
通配符匹配(不推荐,易误屏蔽)
如果想屏蔽该行所有编译器警告,用通配符:
@nowarn("msg=.*") def a = { 1; deprecated() }
三、用行内注释屏蔽IntelliJ IDEA的警告
如果不想改代码也不想全局改设置,IntelliJ支持用特殊注释屏蔽单行或块的警告:
- 屏蔽单行的「syntactic sugar could be used」
//noinspection ScalaSyntacticSugar private val simpleIncrementer = new Function1[Int, Int] { override def apply(arg: Int): Int = arg + 1 }
- 屏蔽单行的「A pure expression does nothing...」
//noinspection PureExpressionStatement def a = { 1; deprecated() }
- 块级屏蔽
用块注释包裹需要屏蔽的代码块:
/*noinspection ScalaSyntacticSugar, PureExpressionStatement */ { private val simpleIncrementer = new Function1[Int, Int] { ... } def a = { 1; deprecated() } }
内容的提问来源于stack exchange,提问作者Nikita Shadkov
相关产品推荐
相关产品推荐

