找不到 Scala 隐式 "not enough arguments"

Scala implicit not found "not enough arguments"

在这个简单的代码中,我有一个方法 buildResponse,它接受一个类型参数 T,它必须是 Response 的子类型。

现在编译器告诉我当我在内部调用 new ResponseBuilder().build\[T]() 时它没有找到隐式值尽管我已经在 Builder 伴随对象中为 class 响应定义了一个隐式值。

我认为由于 T 必须是 Response 的子类型,它将采用 Builder[Response] 的隐式值。如果 T 是其他东西,那么 Response 我会预料到这个错误。

那么完成这项工作的正确方法是什么?

import scala.util.Try;

object Main extends App {



  case class Response(val v:String){

  }

  sealed trait Builder[T] {
    def build(): Try[T]
  }

  object Builder {
    implicit val BuilderResponse = new Builder[Response] {
      def build(): Try[Response] = {
        Try {
          Response("Hello")
        }
      }
    }

    implicit val BuilderInt = new Builder[Int] {
      def build(): Try[Int] = {
        Try {
          1
        }
      }
    }
  }

  class ResponseBuilder
  {
    def build[T:Builder]() : Try[T] = {
       implicitly [Builder[T]].build()
    }
  }

  // works fine
  //new ResponseBuilder().build[Response]();


  //not enough arguments for method build: (implicit evidence: Main.Builder[T])scala.util.Try[T]. Unspecified value parameter evidence.
  def buildResponse[T <: Response ]() : Try[T] = {
    new ResponseBuilder().build[T]();
  }


}

问题不在于您需要 Builder[Response] 类型的隐式值,而是 Builder[T] 类型的隐式值。此处不能使用隐式值 BuilderResponse: Builder[Response],因为 T 可以是 Response.

的任何子类型

您可以通过添加绑定到方法的 Builder 上下文来编译代码 buildResponse

def buildResponse[T <: Response: Builder]() : Try[T] = {
  new ResponseBuilder().build[T]();
}

或者通过在 Builder 伴随对象中定义一个隐式方法 createBuilder[T <: Response]: Builder[T] 以某种方式生成 Builder 对象。

implicit def createBuilder[T <: Response]: Builder[T] = ...