具有零参数的抽象 类 和没有参数的抽象有什么区别?

What's the difference between abstract classes with zero parameters, and those with no parameters?

在 Scala 中,有什么区别:

abstract class Foo
// And
abstract class Bar()

继承的时候好像没有区别:

// All of these seem to work
case class FooA() extends Foo()
case class FooB() extends Foo

case class BarA() extends Bar()
case class BarB() extends Bar

这些真的都是等价的,还是有区别的?如果它们 都是等价的,我应该使用哪个抽象 class 定义,FooBar?

我知道方法之所以有这种区别是因为柯里化。构造 class 时可以柯里化吗?这就是为什么存在这种奇怪的重复的原因吗?

没有区别。 abstract class 只是带有 abstract 修饰符的 class,它强加了一个规则,即除非抽象成员以某种方式实现(无论是通过混合等),否则你不能实例化它。无参数 class 和带有空参数列表的 class 没有区别。如果 class 没有参数列表,编译器会假定一个空参数列表。

这在SLS Section 5.3中有明确说明:

If no formal parameter sections are given, an empty parameter section () is assumed.

因为它们是等价的,所以你应该使用它真的只是一个品味问题。为了简洁起见,我更喜欢省略括号,但编译器无论如何都会将它们添加回去。

只有当您的 class 仅包含隐式参数时,这才会使事情变得混乱。例如,这个:

abstract class Foo(implicit bar: Bar)

实际上是

abstract class Foo()(implicit bar: Bar)

这会在尝试手动提供隐式时造成混淆,并且必须提供括号。例如

new Foo()(new Bar)