Куда поместить `@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
  }}

Как подавить это предупреждение?


Отчасти похожие ссылки

В этом ответе кажется, что @unchecked успешно используется внутри Some(...), но я не понимаю, как использовать его с filter.


person Andrey Tyukin    schedule 31.07.2018    source источник


Ответы (1)


Требуется дополнительная пара круглых скобок вокруг { def ... }:

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

С дополнительными скобками он компилируется просто отлично, без каких-либо предупреждений.


Это похоже на синтаксис для «классических лямбда-выражений», где

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

работал, тогда как

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

не сделал.

person Andrey Tyukin    schedule 31.07.2018