在这个简单的代码中,我有一个方法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]();
}
}
答案 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