Scala 什么';有零参数的抽象类和没有参数的抽象类有什么区别?

Scala 什么';有零参数的抽象类和没有参数的抽象类有什么区别?,scala,inheritance,parameters,call,abstract-class,Scala,Inheritance,Parameters,Call,Abstract Class,在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 这些真的是等价的,

在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


我知道这种区别是因为咖喱。你能在构建一个类时使用咖喱吗?这就是为什么会存在这种奇怪的重复吗?

没有区别。
抽象类
只是一个带有
抽象
修饰符的
,该修饰符规定,除非抽象成员以某种方式实现(无论是通过mixin等),否则不能实例化它。无参数类和参数列表为空的类没有区别。如果类没有参数列表,编译器将假定为空

这一点在以下文件中有明确说明:

如果没有给出形式参数节,则假定参数节()为空

因为它们是等价的,所以实际上只是你应该使用哪种口味的问题。为了简洁起见,我宁愿省略括号,但编译器无论如何都会把它们加回去

这唯一会让事情变得混乱的时候是当你有一个只有隐式参数的类。例如,这:

abstract class Foo(implicit bar: Bar)
实际上是

abstract class Foo()(implicit bar: Bar)
当试图手动提供隐式表达式时,这会导致混淆,必须提供括号。e、 g

new Foo()(new Bar)

据我所知,咖喱是原因。我从来没有在构建一个类的时候满足过自己,但我猜这是可能的。很好,这完全回答了我的问题,谢谢。