import scala.concurrent.duration._
import scala.language.implicitConversions
import scala.concurrent.{Future, Await}
import scala.concurrent.ExecutionContext.Implicits.global
object test extends App {
case class Person(name: String, age: Int)
implicit def t2p(t: (String, Int)) : Person = Person(t._1, t._2)
val f:Future[Vector[(String, Int)]] = Future {
Vector(("One", 1), ("Two", 2))
}
val s = f.mapTo[Vector[Person]]
Await.result(s.map { _ foreach { x => println(x)}}, 5.seconds)
}
我正在尝试将元组的Vector转换为Vector [Person]但是上面的代码导致了一个转换异常,即使有一个隐式元组到Person转换函数?
线程中的异常" main" java.lang.ClassCastException:scala.Tuple2无法强制转换为example.test $ Person at example.test $$ anonfun $ 2 $$ anonfun $ apply $ 1.apply(test.scala:19) 在scala.collection.Iterator $ class.foreach(Iterator.scala:727) 在scala.collection.AbstractIterator.foreach(Iterator.scala:1157) 在scala.collection.IterableLike $ class.foreach(IterableLike.scala:72) 在scala.collection.AbstractIterable.foreach(Iterable.scala:54) at example.test $$ anonfun $ 2.apply(test.scala:19) at example.test $$ anonfun $ 2.apply(test.scala:19)
感谢。
答案 0 :(得分:3)
std::terminate()
只是尝试投射,因此当然尝试将mapTo
投射到Vector[(String, Int)]
将会失败。
您需要一个将Vector[Person]
转换为(String, Int)
的函数,该函数是Person
的三元组版本。
因此,替换
Person.apply
与
f.mapTo[Vector[Person]]
答案 1 :(得分:0)
直接使用:
val f:Future[Vector[Person]] = Future {
Vector(("One", 1), ("Two", 2))
}
有关将mapTo
与Future
一起使用的更多信息,您可以看到此答案:Using mapTo with futures in Akka/Scala
答案 2 :(得分:0)
以下是mapTo
的签名:
def mapTo[S](implicit tag: ClassTag[S]): Future[S]
它不需要任意转换功能。删除t2p
,代码仍然会以相同的方式编译和失败。 mapTo
实际上执行了Java样式的转换,这就是它需要ClassTag
。
相反,你可以这样做:
val s = f.map(vec => vec.map(Person.tupled))