簡體   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