Так я играю с M
типов в Scala и придумал следующее относительно Try
и Either
:Scala Попробуйте либо странное поведение
def brokers(throw1:() => List[Int], throw2: List[Int] => List[String]) = {
println("brokers ===> " +
(Try(throw1())
.toEither
.filterOrElse(!_.isEmpty, Nil)
.flatMap(xs => Try(throw2(xs)).toEither) match {
case Right(s) => s
case Left(f) => throw f.asInstanceOf[Throwable]
})
)
}
И некоторые тестовых прогонов:
brokers(() => List(1, 2, 3), (xs: List[Int]) => xs.map(_.toString))
brokers(() => Nil, (xs: List[Int]) => throw new RuntimeException("throw2"))
brokers(() => Nil, (xs: List[Int]) => xs.map(_.toString))
brokers(() => throw new RuntimeException("throw1"), (xs: List[Int]) => xs.map(_.toString))
brokers(() => List(1, 2, 3), (xs: List[Int]) => throw new RuntimeException("throw2"))
Но :
throw f
не компилируется: «Выражение типа Serializable не соответствует ожидаемому типу Throwable ". Таким образом, актеры.- Исключение из выборки прогона 2:
Исключение в потоке "главный" java.lang.ClassCastException: scala.collection.immutable.Nil $ не может быть приведен к java.lang.Throwable в Практика $ .brokers (Practice.scala: 57) в Practice $ .delayedEndpoint $ Practice $ 1 (Practice.scala: 63)
почему, Scala, почему?