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 中,因此出现错误.但是,如果您使用 =
定义它,则意味着您已经完全实现了该方法。老实说,它是用一个空体来实现的,它很没用,但它仍然被实现了。
我是 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 中,因此出现错误.但是,如果您使用 =
定义它,则意味着您已经完全实现了该方法。老实说,它是用一个空体来实现的,它很没用,但它仍然被实现了。