【问题标题】:What is the maximum number of case class fields in scala?scala中案例类字段的最大数量是多少?
【发布时间】:2022-01-27 23:57:16
【问题描述】:

以前是22,听说现在是512?那是对的吗?有人可以提供来源吗?

【问题讨论】:

  • 您可以拥有超过 22 个,但随后一些便利就消失了,因为元组最多只能达到 22 个。您会在宏中最常遇到这种情况,这些宏会生成案例类的内容(JSON 代码等)
  • 另见stackoverflow.com/a/39981285/8261,它讨论了在 Scala 2.11 之后解除的限制

标签: scala apache-spark


【解决方案1】:

在 Scala 2.11 中存在一个隐式限制,如果您创建一个包含大约 100 多个字段的案例类,您似乎会遇到堆栈溢出(参见答案的底部)。

增加字段数(最多 254 个)的解决方法是

export SBT_OPTS="-XX:MaxPermSize=2G -Xmx2G -Xms2G -Xss8M"

如果你尝试任何高于 254 的值,你会得到

[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(

堆栈溢出错误:

[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)

【讨论】:

  • 我想知道你是否可以通过将堆栈内存大小增加到javac来增加这个限制并仍然生成有效的类文件?试试-J-Xss10M
【解决方案2】:

如果你想要 json(反)序列化,它是 22。至少在 Scala 3 之前。它可能在 Scala 3 中发生了变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2014-12-17
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多