Scala 使用akka http时出现问题,请参阅

Scala 使用akka http时出现问题,请参阅,scala,akka-http,circe,Scala,Akka Http,Circe,假设我有这样的层次结构: sealed trait Animal { def eat = println("eating!") } final case class Dog(name :String) extends Animal {override def eat= println("dog eating")} final case class Cat(name: String) extends Animal {override def eat= p

假设我有这样的层次结构:

sealed trait Animal {
  def eat = println("eating!")
}
final case class Dog(name :String) extends Animal {override def eat= println("dog eating")}
final case class Cat(name: String) extends Animal {override def eat= println("cat eating")}
如您所见,我使用的是akka http和circe,然后我有以下内容:

import io.circe.syntax._
import io.circe.Json
...
pathPrefix("path" / "something") { 
post {
   entityAs[Map[String,Json]] { data => 

      // depending on the key of the map I will create an object Dog or Animal
      val transformed = data.map { d => 
         d._1 match {
            case "dog" => d._2.as[Dog]
            case "cat" => d._2.as[Cat]
         }
      }

      // then I will do something like
      transformed.foreach(_.eat)

      complete(Status.OK)
   }
}
但是由于某种原因,我不能使用eat方法。
我看到
转换的
类型是
不可变的。Iterable[结果[>:Dog with Cat从您的角度来看,每次map键是Dog时,它的值是
Dog
类,但编译器不知道这一点

这就是为什么transformed是
Iterable[Result[X]]
,当遍历Iterable时,您试图调用
Result
类型上的eat方法


您必须从
结果
对象中提取值,只有当它被正确反序列化时

您注意到,您得到的值是:

Iterable[Result[_ >: Dog with Cat <: Animal with Product]]
要访问
eat
方法,您必须执行以下操作:

transformed.foreach(_.map(_.eat))
transformed.foreach(_.map(_.eat))