ホーム>source

シングルトンの文字列を格納するタイプ依存のCfタイプがあります。

<前>ウィズウィズ

一部のHListタイプの列のみを格納する別のクラスDbtestを持つイメージング:

<前>ウィズウィズ

次に、Cfタイプのいくつかの拡張メソッドを記述したかったのですが、制限が1つあります。拡張メソッドが呼び出されるインスタンスのタイプは、DbtestインスタンスのHListに提示する必要があります。

<前>ウィズウィズ

CfおよびDbtestインスタンスのインスタンスを作成します。

<前>ウィズウィズ

これをコンパイルしてほしいのは、 trait Cf { type Name <: String with Singleton def value: Name } object Cf { type Aux[A <: String with Singleton] = Cf { type Name = A } def apply(name: String): Aux[name.type] = { val w = name.witness new Cf { override type Name = w.T override def value: Name = w.value } } } HListで指定された:

<前>ウィズウィズ

そして、これはコンパイルしないので、 class Dbtest[T <: HList](val columns: T) HListには表示されません。

<前>ウィズウィズ

主な問題は-暗黙のセレクタータイプを正しく指定できないため、私の object Ops { implicit class CfOps[C, N <: String with Singleton, T <: HList](ecf: C) ( implicit db: Dbtest[T] , ev: C =:= Cf.Aux[N] , selector: Selector[T, C] ) { private val cf = selector(db.columns) def simplePrint(): Unit = println(cf.value) } } メソッドはコンパイラーからは見えません。

<前>ウィズウィズ

セレクタータイプを正しく指定する方法はありますか?

object Test extends App { val c = Cf("c") val b = Cf("b") val g = Cf("g") implicit val db = new Dbtest(c :: b :: HNil) ...
あなたの答え
  • 解決した方法 # 1

    N を推測する方法はありません   CfOps(ecf) で  特定の ecf: C 、そう N  いくつかの抽象的なタイプであり、暗黙の証拠はありません C =:= Cf.Aux[N]

    CfOps の定義を置き換えてみてください  と

    <前>ウィズウィズ

    その後

    <前>ウィズウィズ implicit class CfOps[N <: String with Singleton, T <: HList](ecf: Cf.Aux[N])( implicit db: Dbtest[T], selector: Selector[T, Cf.Aux[N]] ) { private val cf = selector(db.columns) def simplePrint(): Unit = println(cf.value) }

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ java - 複数のスレッドで複数のREST/SOAPサービスを呼び出し、それらの応答を待ちます