Agreed—also, those two things aren’t equivalent. But I’m happy with writing case class
Product and a forwarder
override def product ... = Product(...).
In practice, this happens because case classes have the same meaning at the top-level and elsewhere, so the generated constructor can’t be (on the JVM) a top-level function, but must be a method on the companion object.
On the principle
case class isn’t just a type, it’s a type + a constructor method. In the spec, they’re classes and methods are both “templates”. That comes (IIUC) from the Beta family of languages, where classes and methods are unified more fully. There, the activation record of a method is nothing but a class, whose members are local definitions of the method, and the body of a constructor is a definition of the members of that class. The second part survives in Scala constructors, the rest is gone thanks to the JVM.