我是Scala的新手,当我用=>
编写一个方法时,它会给出错误,即类必须是抽象的或覆盖方法,当我使用=
时,它确定为什么?
class MainScala {
//change => to = then everything is ok. why?
def main1(args: Array[String]): Unit => {
}
}
答案 0 :(得分:3)
在Scala中,方法名称及其参数列表后跟:
和返回值的类型。然后有一个可选部分:= METHOD_BODY
,其中METHOD_BODY
只是方法的主体,作为单个语句或在语句块中(即由{}
包围)。
示例方法定义如下所示:
def foo(someArgument: TypeOfArgument): ReturnType = {
// some body that returns a value of ReturnType
}
请注意,我说部分= { ... }
是可选的;如果省略,方法只是声明,但没有定义。它的类型签名是已知的(例如,它是一个采用类型TypeOfArgument
的值并返回类型ReturnType
的值的方法),但没有提供实际的方法体(方法未实现)。如果是这种情况,则方法被认为是抽象的。抽象方法只能在特征和抽象类中声明。使用抽象方法扩展特征或抽象类的类必须实现该方法。
在您的情况下,方法def main1(args: Array[String]): Unit => {}
是一个抽象方法(没有主体的方法)的声明,它返回类型Unit => {}
的值。我个人的建议是你不太注意这种类型的含义,因为它无论如何都没有多大意义(我可以告诉你=>
意味着它的功能,所以你有一个从Unit
到{}
的函数;一个相当奇怪的函数,说实话,很可能不是你想要的。
另一方面,方法def main1(args: Array[String]): Unit = {}
是一个返回类型Unit
的值的方法的声明(也就是说,它不会返回任何内容;从技术上讲,它返回值{{1}这是一个空值,但我们可以说返回()
的方法不做任何事情或执行一些副作用,因为它们不会返回任何有用的东西)而且它的主体很简单一个空的语句块Unit
。请注意,如果将方法定义为抽象方法,则需要在特征中执行此操作,或者将类声明为抽象类,但是您处于(具体)类中,因此出现错误。但是,如果使用{}
定义它,则表示您已完全实现该方法。说实话,它是无用的,因为它是用空体实现的,但它仍然实现。
答案 1 :(得分:1)
问题在于=>不是赋值运算符。
所以简单地在你的函数main1(args: Array[String]): Unit => {}
中放置冒号之后的部分:Unit => {}
是返回类型,因为它没有正文,所以解释器明白它是抽象的。
在scala中,总是将主体赋值给函数,因为函数被视为变量(或常量)
修正代码的正确方法是使用相同的方法,正如您在问题中提到的那样。