Scala模式匹配区分路径依赖类型取决于中定义的范围实例?

Scala模式匹配区分路径依赖类型取决于中定义的范围实例?,scala,pattern-matching,path-dependent-type,Scala,Pattern Matching,Path Dependent Type,更新:在repl中运行的简化代码 我想使用路径依赖类型创建特定于域的事件,如创建、更新、删除等,这些类型扩展了一个公共标记特征,以便域可以(a)彼此发送事件和(b)按域进行模式匹配: trait Event trait Domain { case class Created(name: String) extends Event } // declare three instances of Domain trait, one here and two // in an inner s

更新:在repl中运行的简化代码

我想使用路径依赖类型创建特定于域的事件,如创建、更新、删除等,这些类型扩展了一个公共标记特征,以便域可以(a)彼此发送事件和(b)按域进行模式匹配:

trait Event

trait Domain {
  case class Created(name: String) extends Event
}

// declare three instances of Domain trait, one here and two 
// in an inner scope

object DomainC extends Domain

{
   object DomainA extends Domain
   object DomainB extends Domain

   def lookingForAs(event: Event): Unit = {
      println(s"${event.getClass}")
      event match {
        case DomainB.Created(_) => println("Oops matched a B")
        case DomainC.Created(_) => println("Oops matched a C")
        case DomainA.Created(_) => println("Found my A")
      }
   }

   lookingForAs(DomainA.Created("I am an A"))
}
结果是“Oops匹配C”

lookingForAs
功能

  • 与DomainA.Created到DomainB.Created的实例不匹配
  • 与DomainA.Created的实例不正确地匹配到DomainC.Created

Scala 2.10.2、2.10.3、2.10.4和2.11.5的REPLs中的相同结果得到了Scala用户Google Group的回答:Jason Zaugg(化名)说这是一个Scala bug,并创建了跟踪它以针对2.12的修复。再次感谢Jason

在其中定义了类
lookingForAs
?我在同一个文件中定义了一个对象中的所有类型,得到了“Oops matched a B”。上述内容被包装在一个单元测试类中,当然RemoteDomain除外,它位于同一包中的另一个文件中。我将尝试使用相同的文件/不同的封闭对象,看看这是否会产生不同的打印
事件。在
lookingForAs
中的getClass
只为我打印
Domain$Created
,用于
事件的任何来源。它是否在您的案例中打印不同的内容?在
lookingForAs
中打印
Domain$Created
以查找
事件的任何来源,以及
DomainA
/
DomainB
声明是否在单元测试类内部或外部