我有以下代码
import scala.concurrent.Future
class RequestType
class Read extends RequestType
class Write extends RequestType
object Main {
def main(args: Array[String]): Unit = {
}
def dbrequest[T <: RequestType](t: T): Future[T] = {
val dBRequest = new DBRequest
t match {
case r: Read => dBRequest.read(r)
case w: Write => dBRequest.write(w)
}
}
}
class DBRequest {
def read(r: Read): Future[Read] = {
Future(r)
}
def write(w: Write): Future[Write] = {
Future(w)
}
}
读取和写入方法返回RequestType类型的Future
。如果T
有界并且Future
是协变的,那么为什么编译器无法使Future[Read]
或Future[Write]
的类型符合Future[T]
答案 0 :(得分:1)
您的代码将通过一个小的更改进行编译。
def dbrequest[T <: RequestType](t: T): Future[RequestType] = {
那么为什么返回Future[RequestType]
并且返回Future[T]
不起作用,特别是因为T
的界限是这样的?
以这种方式思考:T
在编译时解析。每次调用dbrequest()
时,编译器都会将T
转换为 Read
或Write
。另一方面,match
语句在运行时解析。因此,从编译器的角度来看,match
语句返回 Read
和Write
。
正如已经指出的那样,在这段代码中你并不需要一个类型参数。以下简化是等效的。
def dbrequest(t: RequestType): Future[RequestType] = {
答案 1 :(得分:0)
如果T是有界的并且Future是协变的,那么为什么编译器无法使Future [Read]或Future [Write]的类型符合Future [T]
如果T
保证为Read
或Write
,那么您的代码就有意义了。
但它可以Read with SomeTrait
。或a singleton type(因此即使密封RequestType
,Read
和Write
也无法提供帮助。等等。请参阅我对Returning subclass of parameterized type in Scala的回答以获得解决方案(只需用Output
替换该问题中的Future
。)