如何禁止scala中某些类的模式匹配

Tra*_*ens 4 hibernate scala

与hibernate代理匹配的Scala模式不适用于继承对象的列表.要解决这个问题,我在案例类中包装了hibernate对象,请参阅http://oletraveler.com/2011/04/20/20/

我想要完成的是如果有人试图匹配继承的hibernate实体,则抛出编译时错误(可优先)或运行时错误.

例如:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
class PaymentSource

@Entity
class CreditCard

@Entity User {
  var paymentSources: java.util.ArrayList
}

user.paymentSources.map(_ match {
  case cc: CreditCard => println("oops") // <- this should error
})
Run Code Online (Sandbox Code Playgroud)

我尝试在CreditCard上覆盖unapply,但是这不起作用,因为只有在解构对象时调用unnapply,而不仅仅是在实例上进行匹配.

有没有?

oxb*_*kes 6

我真的没有看到任何纯粹在代码中实现这一点的方法:

case x : SomeType =>
Run Code Online (Sandbox Code Playgroud)

是一种基本模式; 代码无法编译的唯一方法是if SomeType不可见.但是,据推测,这并没有多大用处!

可能是编译器插件用户注释相结合可能会这样做 - 但这不是我的专业领域,但我想它可能看起来像:

@unmatchable class CreditCard( ... )
Run Code Online (Sandbox Code Playgroud)

但是接下来的问题是你无法真正强制你的"客户"会使用这个插件(除非,我想,你确保你的代码在没有它的情况下不能编译 - 不是我知道如何实现它)