在Scala中使用类型检查的误解

Dmi*_*lov 8 scala

我在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?

Mic*_*jac 5

这是一个已知的错误.

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.

请参阅此相关讨论.

和SI-4440