It used to be 22, I heard someone say it's now 512? Is that correct? Can someone provide a source.
Asked
Active
Viewed 3,262 times
2
-
2You can have more than 22, but then some conveniences go away, as tuples go only up to 22. You will encounter this most often in macros generating stuff off case classes (JSON codes and such) – Thilo Apr 03 '19 at 10:36
-
See also https://stackoverflow.com/a/39981285/8261 which discusses the limit being lifted after Scala 2.11 – Rich Apr 04 '19 at 08:57
2 Answers
5
In Scala 2.11 there is an implicit limit, it seems if you create a case class with about more than 100 fields you get a stack overflow (see bottom of answer).
A workaround to get the number of fields higher (up to 254) is
export SBT_OPTS="-XX:MaxPermSize=2G -Xmx2G -Xms2G -Xss8M"
If you try any higher than 254 you get
[error] /Users/sams/src/.../src/main/scala/com/MegaClass.scala:6:12: Platform restriction: a parameter list's length cannot exceed 254.
[error] case class MegaClass(
Stack overflow error:
[error] null
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transformSelect$1(SuperAccessors.scala:253)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:335)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:359)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:71)
...
[error] scala.reflect.internal.Trees$class.itransform(Trees.scala:1345)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error] scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error] scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
[error] scala.tools.nsc.transform.TypingTransformers$TypingTransformer.transform(TypingTransformers.scala:44)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.mayNeedProtectedAccessor$1(SuperAccessors.scala:186)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transformSelect$1(SuperAccessors.scala:332)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:335)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:359)
[error] scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:71)
[error] scala.reflect.internal.Trees$class.itransform(Trees.scala:1345)
[error]
[error] java.lang.StackOverflowError
[error] at scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:178)
[error] at scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:359)
[error] at scala.tools.nsc.typechecker.SuperAccessors$SuperAccTransformer.transform(SuperAccessors.scala:71)
[error] at scala.reflect.internal.Trees$class.itransform(Trees.scala:1345)
[error] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error] at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
[error] at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)

samthebest
- 30,803
- 25
- 102
- 142
-
I wonder if you can increase this limit and still generate a valid class file by increasing the stack memory size to javac? Try `-J-Xss10M`. – Rich Apr 03 '19 at 15:59
0
It's 22 if you want json (de)serialisation. At least in pre Scala 3. It might have changed in Scala 3.

myonlyhope
- 11
- 4