使用 -Ywarn-unused 时从 Scala 中的分析中排除类型证据参数

Excluding type evidence parameters from analysis in Scala when using -Ywarn-unused

在 Scala 中编译包含类型证据参数的程序(例如 T <:< U)可能会在将 -Ywarn-unused 传递给编译器时引起警告。特别是在类型证据参数用于验证使用幻像类型编码的约束的情况下,很可能会出现此警告。

这里编译文件为例: https://github.com/hseeberger/demo-phantom-types/blob/master/src/main/scala/de/heikoseeberger/demophantomtypes/Hacker.scala returns 以下内容:

# scalac -Ywarn-unused Hacker.scala Hacker.scala:42: warning: parameter value ev in method hackOn is never used def hackOn(implicit ev: IsCaffeinated[S]): Hacker[State.Decaffeinated] = { ^ Hacker.scala:47: warning: parameter value ev in method drinkCoffee is never used def drinkCoffee(implicit ev: IsDecaffeinated[S]): Hacker[State.Caffeinated] = { ^ two warnings found

我很清楚ev这个参数在运行时其实不是必须的,但是这个参数在编译时很有用。有什么方法可以指示编译器忽略这种情况,同时仍然在其他上下文中对未使用的函数参数发出警告?

例如,我认为指示编译器忽略 class <:<=:= 的隐式参数可以解决此问题,但我不确定如何实现.

我经常发现自己添加这个是因为 -Ywarn-unused-Ywarn-value-discard:

package myproject

package object syntax {
  implicit class IdOps[A](a: A) {
    def unused: Unit = ()
  }
}

允许您在代码中执行 ev.unused 以明确 "specify" 该值不会被使用或仅用于副作用。您 没有在定义中使用 class 字段,但是 -Ywarn-unused.

没问题

您的另一个选择是使用 silencer 插件来抑制对这几种方法的警告。

许多年后,值得一提的是 @unused 注释可用(从什么时候开始,我不确定):

import scala.annotation.unused

def drinkCoffee(implicit @unused ev: IsDecaffeinated[S]): Hacker[State.Caffeinated]

因此,您不能使用上下文边界