带泛型的返回类型

时间:2017-07-05 06:21:02

标签: scala generics

我有以下代码

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]

2 个答案:

答案 0 :(得分:1)

您的代码将通过一个小的更改进行编译。

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] = {

答案 1 :(得分:0)

  

如果T是有界的并且Future是协变的,那么为什么编译器无法使Future [Read]或Future [Write]的类型符合Future [T]

如果T保证为ReadWrite,那么您的代码就有意义了。 但它可以Read with SomeTrait。或a singleton type(因此即使密封RequestTypeReadWrite也无法提供帮助。等等。请参阅我对Returning subclass of parameterized type in Scala的回答以获得解决方案(只需用Output替换该问题中的Future。)