Scala 2.12如何在特定作用域抑制未使用隐式参数警告
解决Scala 2.12中Trait默认方法未使用隐式参数的报错问题
这个问题我之前也碰到过,在Scala 2.12里确实会遇到这种尴尬——Trait的默认方法需要保留隐式参数供子类重写使用,但自己的实现又用不上,结果编译器把未使用参数的警告(如果开了-Werror就会升级为错误)抛出来。不用写那种val _ = state的伪代码,有更干净的官方解决方案:
方法一:给方法添加@SuppressWarnings注解
你可以直接在默认方法上标注Java的@SuppressWarnings注解,指定忽略未使用参数的检查。这种方式会让编译器跳过当前方法的未使用参数错误,同时全局的检查规则依然生效:
import java.lang.SuppressWarnings trait SomeTrait { @SuppressWarnings(Array("unused")) def defaultMethod(implicit state: State): Unit = { // 默认实现什么都不做 } } class Subclass extends SomeTrait { override def defaultMethod(implicit state: State): Unit = { state.addInformation() } }
方法二:给特定隐式参数添加注解
如果想更精准地只忽略这个隐式参数的未使用检查(而不是整个方法的所有未使用参数),可以直接把注解加在参数上:
import java.lang.SuppressWarnings trait SomeTrait { def defaultMethod(implicit @SuppressWarnings(Array("unused")) state: State): Unit = { // 默认实现什么都不做 } }
为什么这两种方式更好?
和写val _ = state这种伪代码相比,注解是官方支持的语义化解决方案,代码可读性更强,不会留下无意义的代码片段。而且完全不会影响全局的未使用参数检查规则,其他地方的未使用参数依然会触发编译器的错误提示。
需要注意的是,Scala 2.12还没有引入Scala 2.13里的scala.annotation.nowarn注解,所以用Java的@SuppressWarnings是最兼容的选择。
内容的提问来源于stack exchange,提问作者M. Reif
相关产品推荐
相关产品推荐

