[英]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.