Совсем недавно (октябрь 2016 года, через шесть лет после OP) сообщение в блоге « Scala и 22 » из Ричарда Даллауэя исследует этот предел:
Еще в 2014 году, когда была выпущена Scala 2.11, было устранено важное ограничение:
Case classes with > 22 parameters are now allowed.
Это может заставить вас подумать, что нет 22 ограничений в Скала, но это не так. Ограничение сохраняется в функциях и кортежах.
Исправление ( PR 2305 ), введенное в Scala 2.11, устранило ограничение для вышеуказанных общих сценариев: построение классов case, доступа к полю (включая копирование) и сопоставление с образцом ( базирующие крайние случаи ).
Это делалось, опуская
unapply
иtupled
для классов case выше 22 полей. Другими словами, пределFunction22
иTuple22
все еще существует.Работа над пределом (post Scala 2.11)
Существует два распространенных способа обхода этого предела.
- Первое - использовать вложенные кортежи. Хотя верно, что кортеж не может содержать более 22 элементов, каждый элемент может быть кортежем
- . Другим распространенным трюком является использование гетерогенных списков (HLists), где нет 22 предела.
Если вы хотите использовать классы case, вам может быть лучше использовать бесформенную реализацию HList. Мы создали библиотеку Slickless , чтобы сделать это проще. В частности недавний
mappedWith
метод преобразуется между бесформеннымиHLists
и классами case. Это выглядит так:import slick.driver.H2Driver.api._ import shapeless._ import slickless._ class LargeTable(tag: Tag) extends Table[Large](tag, "large") { def a = column[Int]("a") def b = column[Int]("b") def c = column[Int]("c") /* etc */ def u = column[Int]("u") def v = column[Int]("v") def w = column[Int]("w") def * = (a :: b :: c :: /* etc */ :: u :: v :: w :: HNil) .mappedWith(Generic[Large]) }
В базе данных Slickless имеется полный пример с 26 столбцами .