Scala隐含未找到"没有足够的参数"

时间:2015-09-15 12:00:49

标签: scala implicits

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

现在,编译器告诉我,当我在内部调用new ResponseBuilder().build\[T]()时,它没有找到隐式值。我已经在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]();
  }


}

1 个答案:

答案 0 :(得分:3)

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

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

buildResponse

或者通过在def buildResponse[T <: Response: Builder]() : Try[T] = { new ResponseBuilder().build[T](); } 伴侣对象中定义隐式方法createBuilder[T <: Response]: Builder[T],以某种方式生成Builder个对象。

Builder