簡體   English   中英

Scala - 隱式 class 中的重載方法

[英]Scala - Overloading method in implicit class

我目前有一個問題,我正在嘗試使用隱式 class 重載 quill 中包含的方法,通常這在簡單的情況下是可能的,即如果你有類似的東西

class Test {
  def rawr(string: String): String = string
}

您可以使用不同的類型輕松重載rawr的定義,如下所示

implicit final class RawrExt(val t: Test) {
  def rawr(int: Int): Int = int
}

這按預期編譯,即

val t = new Test
t.rawr(5)

即使Test有更復雜的類型參數,這仍然有效,即

class Test[T <: Number] {
  def rawr(string: String): String = string
}

implicit final class RawrExt[N <: Number](val t: Test[N]) {
  def rawr(int: Int): Int = int
}

val t = new Test[BigDecimal]
t.rawr(5)

我遇到問題的地方是當我嘗試為 quill-monix-jdbc 的事務實現完全相同的重載時。 使用 monix-quill-jdbc 時,您有一個具有以下簽名的事務方法

def transaction[A](f: Task[A]): Task[A]

問題是我們在我們的應用程序邏輯中使用了TaskResult ,它是使用貓的EitherTask的 Monad Transformer,即

type TaskResult[T] = EitherT[Task, GeneralError, T]

我要做的是為采用TaskResult而不是Tasktransaction提供覆蓋,在implicit class中定義它是非常簡單的

object TaskResultSupport {
  implicit final class TaskResultCtxSupport[Dialect <: SqlIdiom, Naming <: NamingStrategy](
      val value: MonixJdbcContext[Dialect, Naming]) {

    def transaction[A](f: TaskResult[A]): TaskResult[A] =
      EitherT(value.transaction(f.value))
  }
}

然后當我們嘗試使用它時,我們得到一個編譯錯誤,它似乎無法獲取implicit class

val ctx: PostgresMonixJdbcContext[SnakeCase] =
  new PostgresMonixJdbcContext(SnakeCase, "database")

val taskResult: TaskResult[Unit] = TaskResult(())

ctx.transaction(taskResult) // This doesn't compile

我嘗試了定義隱式 class 的所有各種排列,即作為示例

implicit final class TaskResultCtxSupport(val value: MonixJdbcContext[_, _]) extends AnyVal

而且似乎沒有一個工作。 這是編譯錯誤

type mismatch;
 found   : Playground.this.Implicits.TaskResult[Unit]
    (which expands to)  cats.data.EitherT[monix.eval.Task,Playground.this.GeneralError,Unit]
 required: monix.eval.Task[?]

可以在此處找到演示該問題的scastie https://scastie.scala-lang.org/pqAn8fUPTbmBqToCVIXDXA 感謝 Martjin Hoekstra,這里有一個進一步最小化的例子https://scastie.scala-lang.org/4YrhP0HSRzu7F9numrqAGQ Scala 貢獻者線程可以在這里找到https://contributors.scala-lang.org/t/scala-compiler-unable-to-overload-methods-with-type-parameters/3761

原來這是當前 Scala 編譯器的一個錯誤,解決方案計划用於 2.13。 有關詳細信息,請參閱https://github.com/scala/scala/pull/7396

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM