[英]Return type with generic with bounds
我有以下代码
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]
您的代码将进行一个小的更改。
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] = {
如果T是有界的,而Future是协变的,那么为什么编译器无法使Future [Read]或Future [Write]的类型与Future [T]相一致
如果保证T
是Read
或Write
那么您的代码将很有意义。 但是它可以Read with SomeTrait
。 或单例类型 (因此即使将RequestType
, Read
和Write
密封也无济于事)。 等等,请参阅我对Scala中返回参数化类型的子类的回答以获取解决方案(只需用Future
替换该问题中的Output
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.