[英]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
,它是使用貓的Either
和Task
的 Monad Transformer,即
type TaskResult[T] = EitherT[Task, GeneralError, T]
我要做的是為采用TaskResult
而不是Task
的transaction
提供覆蓋,在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.