как запретить сопоставление с образцом на определенных классах в Scala - PullRequest
4 голосов
/ 16 мая 2011

Сравнение шаблонов Scala с прокси hibernate не работает со списками унаследованных объектов. Чтобы обойти это, я обертываю объекты гибернации в случае классов, см. http://oletraveler.com/2011/04/20/20/

Чего я хотел бы добиться, так это выдать ошибку времени компиляции (предпочтительно) или ошибку времени выполнения, если кто-то пытается сопоставить унаследованный объект гибернации.

Например:

@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
})

Я попытался переопределить unapply на CreditCard, но это не сработало, поскольку unnapply вызывается только при деконструкции объекта, а не только при сопоставлении в экземпляре.

Есть мысли?

1 Ответ

6 голосов
/ 16 мая 2011

Я действительно не вижу никакого способа сделать это чисто в коде:

case x : SomeType =>

Это фундаментальная модель;единственный способ не скомпилировать код - это если SomeType не виден.Но тогда, по-видимому, это не очень полезно!

Может случиться так, что плагин компилятора в тандеме с пользовательской аннотацией может это сделать -это не моя область знаний, но я думаю, это может выглядеть следующим образом:

@unmatchable class CreditCard( ... )

Но тогда проблема заключается в том, что вы не можете принудительно заставить ваших "клиентов" использоватьплагин (если, я полагаю, вы не гарантируете, что ваш код не будет компилироваться без него - не то, чтобы я знал, как этого добиться)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...