当我使用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
中使用它。
答案 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
不是。