Scala-隐式类中的重载方法

时间:2019-10-17 09:56:39

标签: scala overloading implicit 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变压器,即

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

我想做的是为transaction提供一个替代,它使用TaskResult而不是Task,在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

我尝试了各种定义隐式类的排列,例如作为一个例子

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[?]

可以在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

1 个答案:

答案 0 :(得分:0)

原来这是当前Scala编译器的错误,计划在2.13上解决。有关更多详细信息,请参见https://github.com/scala/scala/pull/7396