什么';Scala案例类的背后是什么?

什么';Scala案例类的背后是什么?,scala,Scala,我对Scala非常陌生,但我已经使用了case类。我理解了常规类和案例类的主要区别 我甚至不想去掉case类,但我想知道转换所需的代码是什么,例如: class Tweet(val user: String, val text: String) { override def toString: String = "User: " + user + "\n" + "Text: " + text + "]" } 进入一个完整的“兼容”类。我的意思是,我想编写与case类相同的“

我对Scala非常陌生,但我已经使用了case类。我理解了常规类和案例类的主要区别

我甚至不想去掉case类,但我想知道转换所需的代码是什么,例如:

class Tweet(val user: String, val text: String) {
  override def toString: String =
    "User: " + user + "\n" +
    "Text: " + text + "]"
}
进入一个完整的“兼容”类。我的意思是,我想编写与case类相同的“行为”,但不使用
case
关键字。这是可能的还是编译器做了一些我无法通过代码获得的事情(不包括优化)

再次明确我的要求,当我需要一个case类时,我将始终使用case关键字,但在生命周期中,我想知道Scala编译器(一般意义上)为我做了什么,用代码术语表示

编辑:
还有一个疑问:编译器是否会以某种方式将我手工编码的类与标准的case类区别开来,以便我在执行过程中观察到不同的行为?

您可以查看scala规范中的第5.3.2章“case类”

如果我的总结正确,将自动生成以下内容:

  • 为类元素生成访问器
  • 将自动生成具有应用/取消应用的提取器对象
  • 将自动添加方法副本
  • 重写方法equals、hashCode和toString

您可以比较scala源代码和生成的java字节码来确定

您可以查看scala规范中的第5.3.2章“案例类”

如果我的总结正确,将自动生成以下内容:

  • 为类元素生成访问器
  • 将自动生成具有应用/取消应用的提取器对象
  • 将自动添加方法副本
  • 重写方法equals、hashCode和toString

您可以比较scala源代码和生成的java字节码来确定

如果您觉得可以创建一个在技术上类似于case类的常规类,但是类型系统不会知道它是case类,那么它可能仍然会导致使用上的差异(可能与模式匹配有关)。但我对scala的了解还不够清楚。@giampaolo您将问题改为询问运行时,而ewrnli提到了类型系统,这是一个编译时问题。我能想到的唯一区别是,如果您试图用另一个case类扩展一个case类,编译器会抱怨(过去是可能的,但它会导致问题)。如果您从其他地方导入它,它如何知道它扩展的类是case类,我不确定。@luigipling:好的,我更改了最后一句话。我希望现在更清楚了。如果您觉得可以创建一个常规类,在技术上类似于case类,但类型系统不会知道它是case类,那么它可能仍然会导致使用上的差异(可能与模式匹配有关)。但我对scala的了解还不够清楚。@giampaolo您将问题改为询问运行时,而ewrnli提到了类型系统,这是一个编译时问题。我能想到的唯一区别是,如果您试图用另一个case类扩展一个case类,编译器会抱怨(过去是可能的,但它会导致问题)。如果您从其他地方导入它,它如何知道它扩展的类是case类,我不确定。@luigipling:好的,我更改了最后一句话。我希望现在更清楚了。Scala编译器没有区分这两者。Case类只是普通的类,但是编译器会自动生成许多与之相关的东西,因此它们的行为会有所不同。你可以考虑一个更简单的答案来解决你所面临的问题。Scala编译器并不区分这两个问题。Case类只是普通的类,但是编译器会自动生成许多与之相关的东西,因此它们的行为会有所不同。你可以考虑一个更简单的答案来解决你面临的问题。