抽象类零参数和无参数之间有什么区别?

3
在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

它们真的都等同吗,还是有区别?如果它们确实都等同,那么我应该使用哪个抽象类定义,Foo 还是 Bar

我知道方法之间会因为柯里化而产生差异。在构建一个类时,你是否可以进行柯里化?这就是为什么存在这种奇怪的重复吗?


1
据我所知,柯里化是原因。在构建类时,我从未进行过柯里化,但我猜想这是可能的。 - Eli Sadoff
1个回答

9
没有区别。一个抽象类只是一个带有abstract修饰符的类,这意味着除非通过混合等方式实现了抽象成员,否则不能实例化它。而一个无参类和一个空参数列表的类之间也没有区别。如果一个类没有参数列表,编译器会假定为空参数列表。
SLS Section 5.3中明确说明了这一点:
如果没有给出形式参数部分,则假定为空参数部分()。
由于它们是等效的,使用哪个取决于个人喜好。我喜欢省略括号以节约空间,但编译器会自动添加它们。
唯一可能让事情变得混乱的时候是当你有一个只有隐式参数的类。例如:
abstract class Foo(implicit bar: Bar)

实际上是

abstract class Foo()(implicit bar: Bar)

这会导致混淆,当一个人试图手动提供隐式的时候,必须提供括号。例如:
new Foo()(new Bar)

非常好,这完全回答了我的问题,谢谢。 - Others

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接