斯卡拉隐式未找到"not enough arguments"



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

现在编译器告诉我它没有找到一个隐式的值,当我调用new ResponseBuilder().build[T]()在alltough我已经定义了一个隐式的类响应在Builder伴侣对象。

我认为由于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$1: Main.Builder[T])scala.util.Try[T]. Unspecified value parameter evidence$1.
  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] = ...

最新更新