我在Scala中有简单的类型层次结构:
trait A {
trait A1
}
object B extends A {
case object B1 extends A1
}
object C extends A {
case object C1 extends A1
}
Run Code Online (Sandbox Code Playgroud)
而且,我将使用这样的类型:
def get(): Any = C.C1
get() match {
case _: B.A1 => println("B")
case _: C.A1 => println("C")
case _: A#A1 => println("Any")
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,我正在B打印(我已经预料到了C).
为什么编译器将其C.C1视为实例B.A1?
这是一个已知的错误.
Scalac 不生成此使用的警告-unchecked标志:
warning: The outer reference in this type test cannot be checked at run time.
case _: B.A1 => println("B")
^
Run Code Online (Sandbox Code Playgroud)
所以,现在,B.A1和C.A1出现同样在模式匹配的编译器,因为它不检查外引用B或C.
请参阅此相关讨论.
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |