2016-11-11 16 views
2

Так я играю с 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")) 

Но :

  1. throw f не компилируется: «Выражение типа Serializable не соответствует ожидаемому типу Throwable ". Таким образом, актеры.
  2. Исключение из выборки прогона 2:

Исключение в потоке "главный" java.lang.ClassCastException: scala.collection.immutable.Nil $ не может быть приведен к java.lang.Throwable в Практика $ .brokers (Practice.scala: 57) в Practice $ .delayedEndpoint $ Practice $ 1 (Practice.scala: 63)

почему, Scala, почему?

ответ

4

Отвечая на мой вопрос, получается Either.filterOrElse На самом деле я не думал, что это будет. Если предикат не соответствует, filterOrElse фактически преобразует Either[A, B] в Either[AA, B], где AA является элементом «нуля», предоставленным filterOrElse. В моем случае он преобразовал Either[Throwable,List[Int]] = Right(List()) в Either[java.io.Serializable,List[Int]] = Left(List()). Таким образом, ошибка компиляции и совпадение с case Left и возможное исключение. Serializable должен был исходить из параметра контравариантного типа AA >: A, потому что угадайте, что первый общий супертип для Throwable и List - это Serializable.

Я подал SI-10044 для этого; увидит, что они говорят.

 Смежные вопросы

  • Нет связанных вопросов^_^