Scala class 必须声明抽象,如果我使用 => 而不是 = 为什么?

Scala class must be declared abstracting, if I use => instead of = why?

我是 Scala 的新手,当我用 => 编写方法时,它给出了 class must be abstract or override method 的错误,当我使用 = 时就没问题了为什么?

class MainScala {
//change => to = then everything is ok. why?
  def main1(args: Array[String]): Unit => {

  }
}

问题是 => 不是赋值运算符。 所以简单地说,在你的函数 main1(args: Array[String]): Unit => {} 中,冒号后的部分:Unit => {}return 类型 ,因为它没有a body,解释器理解它是抽象的。

在 scala 中,您总是将 body 分配给函数,因为函数被视为变量(或常量)

修复代码的正确方法是使用 equal,正如您在问题中提到的。

在 Scala 中,方法名称及其参数列表后跟 : 和 return 值的类型。然后是可选部分:= METHOD_BODY,其中 METHOD_BODY 只是作为单个语句或语句块(即被 {} 包围)的方法主体。

示例方法定义如下所示:

def foo(someArgument: TypeOfArgument): ReturnType = { 
  // some body that returns a value of ReturnType
}

注意我说= { ... }部分是可选的;如果你忽略它,方法只是被声明,而不是被定义。它的类型签名是已知的(例如,它是一个方法,它接受类型 TypeOfArgument 的值和 returns 类型 ReturnType 的值)但没有提供实际的方法体(方法未实现) .如果是这种情况,则方法被认为是抽象的。抽象方法只能在 traits 和 abstract classes 中声明。 类 使用抽象方法扩展特征或抽象 class 必须实现该方法。

在您的例子中,方法 def main1(args: Array[String]): Unit => {} 是抽象方法(没有主体的方法)的声明,return 是类型 Unit => {} 的值。我个人的建议是你不要太在意这个类型是什么意思,因为它无论如何都没有多大意义(我可以告诉你 => 意味着它是一个函数,所以你有一个函数来自 Unit{};老实说,这是一个相当奇怪的函数,很可能不是你想要的)。

另一方面,方法 def main1(args: Array[String]): Unit = {} 是 return 类型 Unit 值的方法的声明(也就是说,它不 return任何东西;从技术上讲,它 return 的值 () 是一个空值,但我们可以说 return Unit 的方法要么不做任何事情,要么执行一些副作用因为它们 return 没有任何用处)并且它的主体只是一个空语句块 {}。请注意,如果您将方法定义为抽象方法,则需要在特征中这样做或将 class 声明为抽象方法,但您在(具体的)class 中,因此出现错误.但是,如果您使用 = 定义它,则意味着您已经完全实现了该方法。老实说,它是用一个空体来实现的,它很没用,但它仍然被实现了。