稳定的标识符一致性检查

时间:2015-10-26 20:29:26

标签: scala pattern-matching

所以我有以下代码。根据{{​​3}},此代码不应该编译。

  

稳定标识符模式是稳定标识符r。 r的类型必须符合模式的预期类型。

那为什么要编译?预期的类型显然是Bar。这是scalac中的错误吗?

object Test {
  def foo (b: Bar, a: A) = {
     b match {
       case `a` => println("A")
       case _ => println(":(")
     }
  }

  class A
  case class Bar(s: String)
}

1 个答案:

答案 0 :(得分:1)

你可以这样做(仅用于演示目的,永远不要再这样做):

object Test {
  def foo (b: Bar, a: A) = {
    b match {
      case `a` => println("A")
      case _ => println(":(")
    }
  }

  class A
  case class Bar(s: String)
}

class B extends A {
  override def equals(other: Any) = true
}

Test.foo(Test.Bar("S"), new B)

我没想到它会起作用,但会打印A

B可以在任何地方定义,因此编译器无法确定此案例匹配是否错误,除非A是最终的