在这个简单的代码中,我有一个方法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] = ...