在何处放置“ @unchecked”以禁止“未选中细化类型上的模式匹配”?

时间:2018-07-31 13:59:53

标签: scala annotations warnings suppress-warnings unchecked

当我使用scala运行以下代码段时

import scala.language.reflectiveCalls

def foo(a: Option[Any]): Option[Any] = {
  a.filter {
    case x: { def bar: Boolean } => x.bar
  }
}

object Bar {
  def bar: Boolean = true
}

println(foo(Some(Bar)))

我收到警告

  

警告:未选中与优化类型匹配的模式

我尝试了以下操作:

@unchecked case x: { def bar: Boolean } => x.bar
case (@unchecked x): { def bar: Boolean } => x.bar
case (x @unchecked): { def bar: Boolean } => x.bar
case x: @unchecked { def bar: Boolean } => x.bar
case x: { def bar: Boolean } @unchecked => x.bar
case (x: { def bar: Boolean } @unchecked) => x.bar
case x: ({ def bar: Boolean } @unchecked) => x.bar
case x: { def bar: Boolean } => (x @unchecked).bar
case x: { def bar: Boolean } => (x: { def bar: Boolean } @unchecked).bar

这些都不起作用。这也不起作用:

  a.filter { any => (any: @unchecked) match {
    case x: { def bar: Boolean } => x.bar
  }}

如何禁止此警告?


一些相关链接

This answer似乎在@unchecked内部成功使用了Some(...),但是我看不到如何在filter中使用它。

1 个答案:

答案 0 :(得分:2)

还需要在{ def ... }周围加上一对圆括号:

case x: ({ def bar: Boolean }) @unchecked => x.bar

带有附加括号,它可以很好地编译,而不会发出任何警告。


这似乎与“ classical type-lambdas”的语法相似,其中

({ type Lam[X] = Foo[X] })#Lam

有效,而

{ type Lam[X] = Foo[X] }#Lam

不是。