Scala案例类目前可以有22个以上的属性,但AFAIA编译器不会编译apply / unapply方法。
有没有办法在编译时通过插件生成apply / unapply,或者至少使用IDE等生成方法?
注意
提前感谢您的回答。
答案 0 :(得分:2)
是的,Scala支持版本>22 fields
中的2.11
。但是,存在一些限制 - 案例类将不再有unapply
或unapplyseq
和tupled
(您不再将案例类转换为元组)函数,因为scala仍然没有& #39; t支持更多22个值的元组。
val tup = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) //will compile
val tup = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) //will fail
因此,case类更像普通类类,许多其他库将无法完全利用此case类。比如,json序列化库。
当我尝试使用宏读/写将case类序列化为json时,我遇到了这个问题,并且在playframework项目中反之亦然,因为case类不再包含unapply()方法。解决此问题的方法是为案例类提供自定义implicit read/writes
,而不是使用宏。
case class Person(name: String, age: Int, lovesChocolate: Boolean)
implicit val personReads = Json.reads[Person] //this wond work, need to write custom read as below.
implicit val personReads = (
(__ \ 'name).read[String] and
(__ \ 'age).read[Int] and
(__ \ 'lovesChocolate).read[Boolean]
)(Person)
请不要开始问 - 你为什么需要这个?它用于映射 来自使用Reactive Mongo的mongoDB的现有JSON模式
我假设您的情况相同,您正在使用reactivemongo宏来进行json到案例类序列化。
implicit val personReader: BSONDocumentReader[Person] = Macros.reader[Person]
implicit val personWriter: BSONDocumentWriter[Person] = Macros.writer[Person]
//or Handler
Macros.handler[Person]
因此,我建议您使用自定义BSON阅读器和编写器作为案例类here。