繁体   English   中英

带泛型的返回类型

[英]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转换 ReadWrite 另一方面, match语句在运行时解析。 因此,从编译器的角度来看, match的语句返回两个 ReadWrite

如前所述,在此代码中,您实际上并不需要类型参数。 以下简化是等效的。

def dbrequest(t: RequestType): Future[RequestType] = {

如果T是有界的,而Future是协变的,那么为什么编译器无法使Future [Read]或Future [Write]的类型与Future [T]相一致

如果保证TReadWrite那么您的代码将很有意义。 但是它可以Read with SomeTrait 单例类型 (因此即使将RequestTypeReadWrite密封也无济于事)。 等等,请参阅我对Scala中返回参数化类型的子类的回答以获取解决方案(只需用Future替换该问题中的Output )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM