Scala - 隐式类中的重载方法

标签 scala overloading implicit quill

我目前有一个问题,我正在尝试使用隐式类重载 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]

我想做的是为 transaction 提供一个覆盖,它采用 TaskResult 而不是 Task,在 中定义它>隐式类非常简单

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))
  }
}

然后当我们尝试使用它时出现编译错误,它似乎无法获取隐式类

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

可在此处找到演示该问题的 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了解更多详情。

关于Scala - 隐式类中的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58429854/

相关文章:

Ruby 到 Scala 的代码转换

scala - 如何将列添加到mapPartitions内的org.apache.spark.sql.Row中

c++ - 了解此 `const&` 特化的必要性

wolfram-mathematica - 隐式函数的 FindFit - mathematica

c - 隐式动态链接与显式动态链接 - 哪个更有效?

Scala:如何使 toString() 接受隐式参数?

xml - 我可以使用 Scala 的内置 xml 处理程序忽略无效的 XML 字符吗?

php - 如何拦截 PDO 调用?

c++ - 减少重载函数和构造函数的数量

scala - 将使用访问者的 Traversable 迁移到 Scala 2.13 中的 Iterable