Squerylのバージョン0.9.6では、 typeclassを使用して、KeyedEntityDef
主キーが関連付けられているクラスを宣言する新しい方法が導入されています。まだ古い宣言方法
import org.squeryl.KeyedEntity
case class Foo(id: Long, myField: String) extends KeyedEntity[Long]
サポートされています。
Squeryl 0.9.5を使用する既存のアプリケーションを新しいバージョンに移行して、カスタムプリミティブ型を使用しようとしていますが、コンパイルの問題が発生しています。これは、コンパイルされなくなったトレイトの例です。
trait Retrievable[A <: KeyedEntity[Long]] {
def table: Table[A]
def get(id: Long): Option[A] = inTransaction {
table.lookup(id)
}
}
これは、次のように使用することを目的としていました。
case class Foo(id: Long, myField: String) extends KeyedEntity[Long]
object Foo extends Retrievable[Foo] {
def table = DB.something
}
...
val foo = Foo.get(235)
さて、コンパイルしようとすると、メッセージが表示されます
このメソッドには、スコープ内に暗黙のorg.squeryl.KeyedEntityDef [A、Long]が必要であるか、トレイトKeyedEntity[{K}]を拡張する必要があります。
A
拡張しますがKeyedEntity[Long]
。のような暗黙のスコープを追加することさえ
trait Retrievable[A <: KeyedEntity[Long]] {
def table: Table[A]
implicit val ev: <:<[A, KeyedEntity[Long]]
def get(id: Long): Option[A] = inTransaction {
table.lookup(id)
}
}
暗黙の解決には役立ちません。また、トレイトはコンパイルに失敗します。
コンパイラがルックアップメソッドで暗黙的にフィードしない理由を誰かが知っていますか?