簡體   English   中英

Scala Future奇怪的編譯錯誤

[英]Scala Future strange compile error

下面的代碼是實際代碼的簡化版本。 我們“繼承”了領域模型case object FutTestcase class FutTest ,我們無法對其進行修改。 實際的領域模型是從數據庫提供的,因此我認為“ Future approach是有效的,但它會引起我不了解的問題。

import org.scalatest.FunSpec
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

case object FutTest {
  def create(sz: Int) = { FutTest(sz) }
}

case class FutTest(size: Int)

class FutureTest extends FunSpec {
  def one(v: Int): Future[FutTest] = {
    Future { FutTest.create(v) }
  }
  def two(t: FutTest) = {
    Future { FutTest.create(t.size) }
  }

  def compileError1: Future[FutTest] = {
    one(10).map(f => two(f))
  }

  def compileError2: Future[FutTest] = {
    for { o <- one(10) } yield (two(o))
  }
}

錯誤消息:

[INFO] Using incremental compilation
[INFO] Compiling 7 Scala sources and 5 .. target/test-classes...
[ERROR] domain.FutureTest.scala:25: type mismatch;
 found   : scala.concurrent.Future[domain.FutTest]
 required: domain.FutTest
[ERROR]     one(10).map(f => two(f))
[ERROR]                         ^
[ERROR] domain/FutureTest.scala:29: type mismatch;
 found   : scala.concurrent.Future[domain.FutTest]
 required: domain.FutTest
[ERROR]     for { o <- one(10) } yield (two(o))

我用普通的Int而不是FutTest嘗試了上面的代碼,一切都很好。 為何編譯器會抱怨,如何在不接觸現有域的情況下解決這個問題。

flatMap是您想要的。

one(10).flatMap(f => two(f))

要么

one(10).flatMap(two)

用於理解,

for { o <- one(10); t <- two(o) } yield t

One()返回Futuretwo()也返回Future因此您需要flatMap而不是map 當您映射到two() ,結果為Future[Future[FutTest]] ,需要進行展平。

在做

one(10).flatMap(f => two(f))

應該可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM